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

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

#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++对象模型的思考,布布扣,bubuko.com

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

上一篇:算法中的预处理操作


下一篇:app后端设计(0)--总目录(转)