【C++】虚继承相关问题
【c++】虚继承实例代码
虚继承就是为了解决二义性而产生的。 分为成员变量二义性和成员函数二义性 不调用同名成员则不产生二义性问题
为什么虚继承能够解决?
因为有了虚继承后能够让虚基类(基类还是那个基类,变化的只是继承时候的方式,加了关键字virtual使得继承方式变为了虚继承,此时基类就成为了虚基类,与抽象类完全不同!)中的成员只保存一份,不在子类中进行初始化。只有一个成员,自然不会产生二义性。
虚继承示例代码
#include <iostream> using namespace std; class A { public: int _a; A(int a = 0) :_a(a) { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } }; class B :virtual public A { public: B():A(99) { cout << "B()"<< _a << endl; } ~B() { cout << "~B()" << endl; } }; class C:virtual public A { public: C() :A(100) { cout << "C()" << _a << endl; } ~C() { cout << "~C()" << endl; } }; class D:virtual public C, virtual public B { public: D():A(101) { cout << "D()" << _a << endl; } ~D() { cout << "~D()" << endl; } }; int main() { D d; return 0; }
可以看出虚基类只被初始化一次,是在最底层的子类创建时,虚基类被创建。
如果底层子类不调用:
除此之外,虚基类的创建还发生在自己创建的时候(如果底层子类没有调用构造函数) 虚继承只解决菱形继承的问题,其他多继承无需使用虚继承解决
下一篇:
java中遍历数组的三种常用方式(附码)