一、我们首先看一个例子,一个孙子类继承了两个父亲类,两个父亲类同时继承同一个爷爷类。
#include <iostream>
using namespace std;
class Parent
{
public:
int p_; // p将会被所有的子类继承,也将是二义性的根源
Parent(int p):p_(p)
{
cout<<"Parent ..."<<endl;
}
};
class Child1 :virtual public Parent
{
public:
Child1(int p) : Parent(p)
{
cout<<"Child1 ..."<<endl;
p_ =3; // p在子类Child1中被赋值为12
}
virtual void display()
{
cout<<"Child1 display"<<endl;
}
};
class Child2 :virtual public Parent
{
public:
Child2(int p) : Parent(p)
{
cout<<"Child2 ..."<<endl;
p_=5; // p在子类Child2中被赋值为13
}
virtual void display()
{
cout <<"Child2 display"<<endl;
}
};
class GrandChild : public Child1, public Child2
{
public:
int grandchild;
// p显然也存在于GrandChild中,但是到底是12,还是13呢?这就产生了二义性
GrandChild(int p) : Child2(p),Child1(p),Parent(p)
{
cout<<"GrandChild ..."<<endl;
grandchild = 14;
}
virtual void display()
{
cout<<"GrandChild display"<<endl;
}
};
int main(void)
{
Child1* pGC = new GrandChild(4);
pGC->display();
delete pGC;
return 0;
}
结果为:
Parent ...
Child1 ...
Child2 ...
GrandChild ...
GrandChild display
如果把Child1* pGC = new GrandChild(4);修改成Child2* pGC = new GrandChild(4);那么程序就会报错。
如果把class GrandChild : public Child1, public Child2修改成class GrandChild : public Child2, public Child1。
那么Child2* pGC = new GrandChild(4);执行正常。Child1* pGC = new GrandChild(4);执行错误。
为什么,我也不知道,从这个例子让我感觉到学习C++对象模型的重要性。如果知道C++对象模型,我认为上面的问题就迎刃而解了。