虚基派生二义性与多基派生二义性不同点
- 多基派生的二义性主要是成员名的二义性,通过加作用域限定符来解决
-
虚集派生的二义性则是共同基类成员的多重拷贝带来的存储二义性,使用
virtual
派生解决 -
二义性的检查是在访问权限检查之前进行的,因此,成员的访问权限是不能消除二义性的
有继承关系的构造析构调用总结
- 派生时,构造函数和析构函数是不能继承的,为了对基类成员进行初始化,必须对派生类重新定义构造函数和析构函数,并在构造函数的初始化列表中调用基类的构造函数
- 由于派生类对象通过继承而包含了基类数据成员,因此,创建派生类对象时,系统首先通过派生类的构造函数来调用基类的构造函数,完成基类成员的初始化,而后对派生类中新增的成员进行初始化。
- 在执行派生类析构函数时,积累析构函数会被自动调用,执行顺序是限制性派生类的析构函数,在执行基类的析构函数,这和执行构造函数时的顺序正好相反。
隐藏、覆盖、重载
- 隐藏(oversee):父子类,函数名称相同,但参数不同,无论virtual关键字的函数。
- 覆盖(override):父子类,函数的名称、返回值类型、参数类型个数相同,带virtual关键字的函数
- 重载(overload):同一个类,函数名称相同,参数不同(类型、顺序、个数)。
基类与派生类对象间的相互转换
类型适应:派生类适应于基类,派生类的对象、引用、指针适应于基类对象,引用、指针
- 可以把派生类的对象复制给基类的对象
- 可以把派生类的对象赋值给基类的引用
- 可以声明基类的指针指向派生类的对象(向上转型)
Base base;//基类Base的对象base
Derived derived;//派生类Derived的对象derived
base = derived; //可以把一个派生类对象赋值给基类对象
derived = base;//不可以把一个派生类对象赋值给基类对象
Base *pbase = &base;
pbase = &derived;//向上转型,是安全的
Derived *pderived = (Derived*)pbase;//向下转型,是不安全的