- final关键字可用于阻止继承的发生,如class Student final()意为Student不可作为基类
- 使用using声明可以改变派生类中基类成员的访问权限,如 using Student::m_id;
- 若派生类成员的名字和基类的成员名相同,那定义在派生类中的名字会屏蔽掉基类中的成员名
- 派生类构造函数的执行过程为:首先调用其直接基类的构造函数,然后构造自身成员,最后执行构造函数函数体,同样,复制构造函数和赋值都需要显式写出基类的操作,否则会调用默认函数,赋予默认值而与想法不符。析构过程则与构造过程相反
- 动态绑定触发条件:重写基类的虚函数,还必须用基类的指针或引用才能触发动态绑定 虚函数形如:virtual double area()const {return 0;}重写后:double area()const {return 3.14;} 注:模板成员不能声明为虚函数,因为该成员的行为必须在编译时确定,不能实现动态绑定;若基类某函数被声明为虚函数,则派生类中对应的重写版本自动为虚函数;
- 虚析构:通常情况下,基类的析构函数应为虚函数,保证正确delete一个动态派生类对象,若基类析构函数为非虚函数,则delete一个指向派生类对象的基类指针将产生未定义的行为。
- override和final关键字:动态绑定通过同名虚函数覆盖实现,利用override显示告诉编译器派生类覆盖基类版本的虚函数,用final阻止派生类覆盖基类虚函数 如void fun()override{};
- 抽象类:含有纯虚函数的类为抽象类,纯虚函数:virtual double area()const=0.抽象类只负责接口的声明,不能创建类的实例。
- 多重继承和虚继承:一个类可以继承多个类称为多重继承。当出现菱形继承产生二义性时,考虑用虚继承,如class Mammal:virtual Animal{};虚继承的构造由最底层派生类进行构造。