关于C++对象模型的思考

来源:互联网 发布:淘宝海外开店 编辑:程序博客网 时间:2024/05/16 09:11

一、我们首先看一个例子,一个孙子类继承了两个父亲类,两个父亲类同时继承同一个爷爷类。

#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++对象模型,我认为上面的问题就迎刃而解了。

0 0