继承
继承就是当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。 举个例子:人是动物,人具有动物的行为和属性,但人也有动物所不具备的行为和属性。
![d77fed09188931da9cfa452ba0a8adaf.png](https://i-blog.csdnimg.cn/blog_migrate/f6ceb171d9890179d55bd050c4bad39a.png)
继承的实现
本实现使用了组合的方式,即把基类作为派生类的成员变量之一。 但是一定要将基类放在派生类首部,这要基类和派生类的内存首部分布才一致。
/* 基类 */
![36607531584168123f8c1455d7b3b6ff.png](https://i-blog.csdnimg.cn/blog_migrate/63fc6579013de4a4bf651d9ed5861ef1.png)
在派生类中的构造函数需要调用基类的构造函数用于初始化,然后再将构造函数创建的基类对象拷贝到派生类中。 但由于是浅拷贝,即只拷贝了地址,没有拷贝地址的内容。所以要在派生类中加入基类指针成员变量,用于在析构函数释放内存。
typedef
由于在c语言下没有类型检查功能,在调用创建的类函数时就十分不安全,在基类加入基类类型名和类大小成员变量可以解决这个问题。 基类类型名用于判断调用函数对象是否继承自该类,而类大小用于判断调用函数对象是基类还是派生类。(该方法只适用于线性继承,若有更合适的方法,请在评论区留下你宝贵的建议。)
![37c5333a7b7bf309d507b31aed0b2a96.png](https://i-blog.csdnimg.cn/blog_migrate/c22c00544a898466fb4328b99770272e.png)
typedef
多态
在上个例子中,人和动物都有会动的属性,但人的动作和动物的动作从表现上会有所不同。而多态就可以实现在同一个函数中,根据对象类型的不同,函数实现方式也不同。
多态的实现
c语言多态的实现,需要用到函数指针。函数名实际上是该函数代码存储空间的首地址,这个地址可以通过函数指针来存放。通过改变函数指针存储的地址就可以实现多态。
typedef
示例代码
该代码将结合上述继承和多态的方法实现对基类函数进行重写:
/* animal.h */
结果如下:
![eb1e5443e40a95993b3e6d83836b7daa.png](https://i-blog.csdnimg.cn/blog_migrate/2ff1f5a56eb6bdb6b4680fc9fc678e52.jpeg)