关于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++对象模型的思考

时间: 2024-08-06 17:39:27

关于C++对象模型的思考的相关文章

《深度探索C++对象模型》——C++与C程序风格对比

在C语言中,“数据”和“处理数据的操作(函数)”是分开来声明的.由一组“分布在各个以功能为导向的函数中”的算法所驱动,处理共同的外部数据. 先看一个例子: 如果我们声明一个struct Point3d, typedef struct point3d { float x; float y; float z; }Point3d; 欲打印一个Point3d,可能就得定义一个像这样的函数: void Point3d_print( const Point3d *pd) { printf("(%g, %g,

玩转oo对象模型(1) 之 初窥c++对象模型

============================================== copyright: KIRA-lzn ============================================== 转载请注明出处,这篇是我原创,翻版必究! ============================================== 第二篇,如果写的好,请点个赞呦.当然有不对之处,非常欢迎拍砖!!!! 自我介绍: USTC研一学生,目前在intel实习,研发岗 第二篇

关于C++中虚函数表存放位置的思考

其实这是我前一段时间思考过的一个问题,是在看<深入探索C++对象模型>这本书的时候我产生的一个疑问,最近在网上又看到类似的帖子,贴出来看看: 我看到了很多有意思的答案,都回答的比较好,下面贴出一些具有代表性的: Answer 1: Answer 2: 我们都知道,虚函数是多态机制的基础,就是在程序在运行期根据调用的对象来判断具体调用哪个函数,现在我们来说说它的具体实现原理,主要说一下我自己的理解,如果有什么不对的地方请指正在每个包含有虚函数的类的对象的最前面(是指这个对象对象内存布局的最前面,

C++对象模型——关于对象(第一章)

第一章    关于对象 在C语言中,"数据"和"处理数据的操作(函数)"是分开声明的,也就是说,语言本身并没有支持"数据和函数"之间的关联性.我们把这样的程序方法成为程序性,由一组"分布在各个以功能为导向的函数中"的算法所驱动,它们处理的是共同的外部数据.举个样例,假设声明一个struct Point3d,像这样: typedef struct point3d { float x; float y; float z; } Po

C++面向对象模型初探

C++面向对象模型初探 1. 基础知识 C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类.从计算机的角度,程序依然由数据段和代码段构成. C++编译器如何完成面向对象理论到计算机程序的转化? 换句话:C++编译器是如何管理类.对象.类和对象之间的关系 具体的说:具体对象调用类写的方法,那,c++编译器是如何区分,是那个具体的类,调用这个方法那? 思考一下程序结果 #include "iostream" using namespa

有关.NET参数传递方式的思考

年关将近,整个人已经没有了工作和写作的激情,估计这个时候很多人跟我差不多,该相亲的相亲,该聚会喝酒的聚会喝酒,总之就是没有了干活的心思(我有很多想法,但就是叫不动我的手脚,所以我只能看着别人在做我想做的事,吃我想吃的东西.).本人由上个月的每周四五篇,到现在的文章缩短到每周一篇,说个实话,现在的一篇也有不想写的心思了(这一篇还是咬着牙写的,感觉实在是写不动了,写博客太折腾人了,谁写谁知道啊!),不过还是希望写出来可以帮到大家,如有写的不足的地方,还望大家多多指正,知识在于总结和反思,对别人也对自

关于.NET参数传递方式的思考

年关将近,整个人已经没有了工作和写作的激情,估计这个时候很多人跟我差不多,该相亲的相亲,该聚会喝酒的聚会喝酒,总之就是没有了干活的心思(我有很多想法,但就是叫不动我的手脚,所以我只能看着别人在做我想做的事,吃我想吃的东西.).本人由上个月的每周四五篇,到现在的文章缩短到每周一篇,说个实话,现在的一篇也有不想写的心思了(这一篇还是咬着牙写的,感觉实在是写不动了,写博客太折腾人了,谁写谁知道啊!),不过还是希望写出来可以帮到大家,如有写的不足的地方,还望大家多多指正,知识在于总结和反思,对别人也对自

BOM:浏览器对象模型之浏览器剖析入门

BOM简介 BOM与DOM的关系 BOM对象包含的内容 重新认识浏览器 一.分裂的BOM和被收服的DOM BOM定义:是browser object model的缩写,简称浏览器对象模型. 主要处理浏览器窗口(window)和框架(iframe),描述了与浏览器进行交互的方法和接口,可以对浏览器窗口进行访问和操作,不过通常浏览器特性的JavaScript扩展都被看做是BOM的一部分,比如:弹出新的窗口,移动关闭浏览器窗口或调整浏览窗口大小,提供web浏览器详细信息的定位对象,提供屏幕分辨率详细信

谈谈对象大小——从字节对齐到对象模型

谈谈对象大小——从字节对齐到对象模型 一. 前言         这篇文章主要介绍以下从c的结构体变量到c++的类对象中编译器对内存分配做的事情.总而言之,言而总之,这篇文章就是讲述对于一个变量(对象)它的内存布局是怎么样子的.         为了方便描述,我们按照以下几个层次来讲述:                 1.c中struct的字节对齐                 2.从struct到class的过渡                 3.单继承对对象内存模型的影响