C++之继承多态初识
3、继承
-
代码复用的两种方式:
- 组合
- 继承
- 继承的权限:private、protected、public;
-
子类构造函数:初始化子类成员,调用父类的构造函数初始化父类的成员(对象初始化列表)
- 注意:若父类没有无参构造函数,则子类中所有构造函数中显示调用父类的构造函数。
-
构造函数的调用顺序:先构造父类(继承时的前后顺序),子对象(其他类的对象),后构造子类。
- 缺点:固定的调用时机,一般用自己写的init函数代替构造函数。
- 析构函数的调用顺序:与构造函数相反。
- 多继承:
此时D如果想要调用A中的成员变量的话,则会产生二义性,即D不知道A中的成员从B还是C中取出。可以显示调用: eg:D d; d.A::getNum()。//getNum为A类中的成员函数
同时可以通过虚继承来解决多继承带来的二义性。
虚继承------实现机制?
底层实现原理:底层实现原理与编译器相关,一般通过虚基类指针实现,即各对象中只保存一份父类的对象,多继承时通过虚基类指针引用该公共对象,从而避免菱形继承中的二义性问题。
4、多态
- 概念:同一个接口,传递不同的参数,执行不同的操作。
-
多态的条件:
- 继承
- 要有虚函数
- 要发生虚函数的重写(动态联编) override
- 发生的时机:基类指针或者是引用指向派生类
- 意义:可以在任意的地方,用子类替换父类
-
作用:
- 提高代码的扩展性(添加新功能时,不修改原来的代码,只添加新的代码(开闭原则))
- 多态实现的情况下,父类的析构函数必须是虚析构函数? 如果不是,就不能正常释放子对象的空间?