多继承和虚基类

一.多继承机制存在哪些问题,怎么解决这些问题?
——歧义性:相同名称的成员在内存中同时拥有多个拷贝,当通过派生类对象使用这些成员时,就会产生歧义性。作用域操作符虽然能解决歧义性问题,但并没有解决多个拷贝的问题。

 

类D 的内存布局

使用虚拟机制注意事项:
1.若在虚基类中定义了带参数的构造函数,而没有定义默认构造函数,则必须在所有的直接或间接派生类中使用成员初始化列表调用虚基类的构造函数。
注意:
  • 如果没有虚拟继承,则只需要在直接派生类中使用成员初始化列表调用虚基类的构造函数。
  • 在上例中,如果B,C,D都调用了A的构造函数,那么有效构造函数为调用该构造函数的类所定义的构造函数,每个继承的类都显示调用基类构造函数可以解决各个派生类定义的构造函数不一致的情况。
2.如果在同一继承层次中同时包含虚基类和非虚基类,C++编译器先调用虚基类的构造函数,再调用非虚基类的构造函数。
 
3.如果虚基类是由非虚基类派生而来,同样遵循先调用基类构造函数,再调用派生类构造函数。
 
(实际应用中并不建议使用多重继承,一则因为编译器问题,二则多重继承会带来二义性问题。单继承对描述事物已经提供了足够强大的功能。并非要使用多继承不可)
 
二.多继承构造函数和析构函数的执行顺序
析构函数的调用顺序与构造函数相反
例如:
 
基类指针与派生类指针的指向关系
基类指针或引用可以在不进行显示类型转换的情况下指向派生类对象,但基类指针或引用只能用于调用基类方方法。派生类指针不可以指向基类对象。
原文地址:https://www.cnblogs.com/happygirl-zjj/p/4635958.html