先给大家看一下菱形继承的结构:
B和C都单继承了A
D继承了B和C 是多继承 有两个或两个以上的基类就是多继承
class A { public: A(int a = 0) :ma(a) { cout << "A" << endl; } public: int ma; }; class B : public A { public: B(int b) :mb(b),A(b) { cout << "B" << endl; } public: int mb; }; class C : public A { public: C(int c) :mc(c), A(c) { cout << "C" << endl; } public: int mc; }; class D : public B, public C { public: D(int d) :md(d),B(d),C(d) { cout << "D" << endl; } public: int md; };
菱形继承造成的问题:就是D中有两份A中的数据ma 就是所谓的二义性 编译都通不过
为了解决这个问题 可以用虚继承来解决
虚继承的原则就是:谁从A直接继承 就让谁虚继承A
B和C虚继承A
class A { public: A(int a = 0) :ma(a) { cout << "A" << endl; } virtual void Show() { } public: int ma; }; class B : virtual public A { public: B(int b) :mb(b),A(b) { cout << "B" << endl; } public: int mb; }; class C : virtual public A { public: C(int c) :mc(c), A(c) { cout << "C" << endl; } public: int mc; }; class D : public B, public C { public: D(int d) :md(d),B(d),C(d) { cout << "D" << endl; } public: int md; };B、C都从A虚继承 此时A成为虚基类 这样就可以解决D中有两份A数据的问题 解决了二义性的问题