#include <iostream>using namespace std;class Parent {public: int i; Parent() { i = 10; } virtual void foo() { cout << "Parent foo i is " << i << endl; }};class Child1 : public Parent {public: int d1; Child1() { i = 11; d1 = 10; } virtual void foo() { cout << "Child1 foo i is " << i << " d1 is " << d1 << endl; }};class Child2 : public Parent {public: int d2; Child2() { i = 12; d2 = 10; } virtual void foo() { cout << "Child2 foo i is " << i << " d2 is " << d2 << endl; }};class GrandChild : public Child2,public Child1 {public: virtual void foo() { cout << "GrandChild foo i is " << i << endl; }};int main() { GrandChild* g = new GrandChild(); g->foo(); return 0;}
这个无法通过编译,i存在二义性。error: reference to `i' is ambiguous| 。
修改一下代码通过虚继承的方式可以避免这种数据成员的二义性。
class Child1 : public virtual Parent {public: int d1; Child1() { i = 11; d1 = 10; } virtual void foo() { cout << "Child1 foo i is " << i << " d1 is " << d1 << endl; }};class Child2 : public virtual Parent {public: int d2; Child2() { i = 12; d2 = 10; } virtual void foo() { cout << "Child2 foo i is " << i << " d2 is " << d2 << endl; }};
编译运行:GrandChild foo i is 11.
如果把继承的顺序改一下,改为class GrandChild : public Child1,public Child2 。 则输出的是12了。在多重继承中,通过虚继承的方式解决成员二义性的问题,并且最右边的基类的成员变量会出现在派生类中。