一、我们首先看一个例子,一个孙子类继承了两个父亲类,两个父亲类同时继承同一个爷爷类。
#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++对象模型,我认为上面的问题就迎刃而解了。
关于C++对象模型的思考
时间: 2024-10-06 00:38:54