目录
继承
二义性
多继承
虚继承
多态
地址早绑定和晚绑定
父类指针指向子类对象
纯虚函数与抽象类
虚析构与纯虚析构
继承
继承方式
(1)protected子类可以访问父亲的保护内容。private子类不能访问父亲的私有成员。
(2)
(黑马up图)
(3)继承中,构造先调用父类构造函数,在调用子类构造函数。析构先调用子类析构函数,在调用父类析构函数。和栈同。
继承例子
包含子类构造、访问父类被隐藏的同名成员函数。
(4)
访问父类被隐藏的静态成员变量(类外初始化)
(5)
因为子类没有再次定义而报错?
访问父类被隐藏的静态成员变量同上一条
……
二义性
例子:吕布有两个爹,那过年过节准备回哪个爹的家呢?
问题:两个父类中有同样的属性,子类使用时要加作用域区分
解决方法1:加作用域
多继承:
虚继承
菱形继承
动物
/
羊 驼
/
羊驼
虚继承原理:羊驼类并不是继承了羊类和驼类的数据,而是他俩的指针,指针通过偏移量找到唯一的数据age。
多态
静态多态:函数重载,运算符重载
动态多态:派生类和虚函数
多态好处:1.组织结构清晰 2.可读性强 3.对于前期和后期的拓展 4.维护性高。
地址早绑定和晚绑定
(1)早绑定
没能实现输出猫说话
(2)晚绑定,在父类的同名函数前加virtual,
实现了猫说话。
地址早绑定,在编译阶段进行了绑定。
实现地址晚绑定,在父类中+virtual,在运行阶段进行绑定。
父类指针指向子类对象
父类创建一个指针指向一个new的子类
纯虚函数与抽象类
只要有一个纯虚函数,这个类被定义为抽象类。
(1)纯虚函数会导致该类无法实例化对象。
(2)抽象类的子类必须重写纯虚函数,否则子类也属于抽象类。
虚析构与纯虚析构
虚析构和纯虚析构实现通过父类指针释放子类对象
问题:“ani析构上一行缺少了cat析构”
原因:父类指针释放子类对象,可能导致子类对象清理不干净,造成内存泄漏
办法:将父类的析构函数设置为虚析构函数,
解决前↓
解决后↓
子类没有堆区,可以不写虚析构和纯虚析构。
(1)成员函数前面只加virtual,是防止二义性。
(2)加virtual弄成纯虚函数,是为了提醒自己的子类要重写这个函数。
(3)虚析构和纯虚析构实现通过父类指针释放子类对象
(4)拥有纯虚析构/纯虚函数的属于抽象类 【virtual 返回值类型 函数名()=0;】



