#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了。在多重继承中,通过虚继承的方式解决成员二义性的问题,并且最右边的基类的成员变量会出现在派生类中。