1.多重继承对象大小

class Point2d
{public:Point2d(int x = 10, int y = 20): _x(x), _y(y){}virtual void z(int ) {  }virtual int GetZ()const { return 0; }inline int GetY(void) const { return _x; }inline int GetX(void) const { return _y; }virtual void operator+= (const Point2d & Temp){_x += Temp.GetX();_y += Temp.GetY();}protected:int _x, _y;
};class Point3d : public Point2d
{public :Point3d(int x, int y, int z):Point2d(x, y),_z(z){}int GetZ() const{ return _z;}void z(int z) { _z = z; }virtual void operator+= (const Point2d& Temp){Point2d::operator+=(Temp);_z += Temp.GetZ();}protected:int _z;
};class Vertex
{public:virtual void Test(){}protected:Vertex* pNext;
};class Vertex3d : public Point3d, public Vertex
{public://....
protected:int Mumble;
};

①Point2d:一个虚函数表的指针,两个int变量 总共12个字节
②Point3d:一个虚函数表的指针,三个int变量(两个是继承Point2d) 16字节
③Vertex:一个虚函数表的指针,一个int变量 8字节
④Vertex3d:继承自Point3d 和 Vertex 自己还有一个int , 一共28个字节

2.多重继承的对象模型


先继承的Point3d,所以直接把一个Point3d的指针指向一个Vertex3d的对象时完全没问题的,不需要做任何附加动作

3.对于第二个及其之后的base class的地址指定操作

Vertex3d v3d;
Vertex *pv;
Point2d *p2d;
Point3d *p3d;

现在来进行指定

pv = &v3d;cout << (int*)&v3d << endl;
pv = &v3d;
cout << (int*)pv << endl;


他们之间地址的差值差了16个字节,so差了一个Point3d
所以他们内部的转化是
pv = (Vertex * ) ( (char*)&v3d) + sizeof(Point3d) );

3.两个指针

Vertex3d *pv3d
Vertex *pv;pv = pv3d;

如何转化呢?
不能只是简单的转化为

pv = (Vertex *)((char *)pv3d) + sizeof(Point3d);

如果pv3d是一个空指针呢?

pv = pv3d? (Vertex *)((char *)pv3d) + sizeof(Point3d) : 0;

继承与data member之多重继承相关推荐

  1. 继承与 Data Member(2)

    加上多态的情况 如果我要处理一个坐标点, 而不在意这是一个 Point2d 或 Point3d 实例, 那么就需要在继承关系中提供一个 virtual function 接口: class Point ...

  2. c++Data Member的绑定

    Data Member的绑定 Data Member的绑定 Data Member的布局 Data Member的存取 继承与Data Member 含多态的继承 多重继承 虚继承 指向Data Me ...

  3. Data Member 的存取

    考察以下代码: Point3d origin; origin.x = 0.0; 此例中 x 的存取成本是什么? 答案则是视 x 和 Point3d 而定(别打脸, 我知道这是废话). 具体的呢? 因为 ...

  4. 深度探索C++ 对象模型(6)-Data member的存取

    nonstatic data member 需要在class object起始地址加上该member的偏移. class A {public: int x; int y;}; A a; a.y = 0 ...

  5. 深度探索C++ 对象模型(6)-Data member的绑定

    防御性程序设计 1).将class声明起头处放data member; 代码示例: class Point3d{ float x,y,z; public://etc } 2). class的声明处放i ...

  6. Data Member 的绑定

    考察以下代码: extern float _x;//user code class Point3d { public:Point3d(float, float, float);//问题来了, 是哪一个 ...

  7. 提示illegal reference to data member'CPMAgentManageDlg::m_matrixMatrixSt'in a static member function

    当提示"illegal reference to data member'CPMAgentManageDlg::m_matrixMatrixSt'in a static member fun ...

  8. qt error: C2491: ‘ ::staticMetaObject‘: definition of dllimport static data member not all

    场景: Qt 5.14.0 +MSVC2015 32位 ,使用qt导入外部库的时候,发现出现以下问题 error: C2491: ' ::staticMetaObject': definition o ...

  9. 深度探索C++ 对象模型(7)-Data member的布局(虚继承)

    虚拟继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...

  10. 深度探索C++ 对象模型(7)-Data member的布局(多重继承)

    多重继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...

最新文章

  1. Notepad2 一个很不错的记事本
  2. 新手篇——学习网页开发需要多长时间就能找到工作
  3. /bin/bash^M解决办法
  4. com.css.common.jdbcTemplate中的类
  5. C++中class与struct的区别
  6. saiku连mysql 使用_saiku应用的调试
  7. 老司机翻车现场:一个业余程序员组织如何收到滴滴的侵权通知?
  8. 英特尔处理器接连爆出漏洞,Intel:这次不打算修了
  9. 数学画图软件_关于数学建模(或科研绘图)的画图学习建议
  10. 走进MSTP -- 4. OSN7500/7500II/3500/1500硬件速览
  11. 皮尔逊相关系数_皮尔逊相关系数(Person)
  12. Windows 10微软应用商店打不开问题解决方案
  13. 2013年国考行测错题集(省级)
  14. 2011QQ搞笑个性签名:小弟不才,大名耶稣.小名上帝.法号如来
  15. 未来广告机面临的问题
  16. ios+android备份短信恢复软件下载,iPhone备份短信教程:iOS短信导出技巧大全
  17. 关于FTP获取文件,过滤器,下载文件0kb问题
  18. ChinaSkills-网络系统管理(2021年全国职业院校技能大赛B-1 模块 B:Windows 环境 评分标准 )
  19. 【机器学习】缺失值的处理方法总结
  20. アプリケーションコンポーネント(大分類)

热门文章

  1. ExecutorService中submit和execute的区别
  2. windows环境下kafka源代码开发环境搭建
  3. 你说你会用Companion object?恐怕不是!
  4. 前端技术周刊 2018-08-06:ES Module
  5. c# 判断两个集合是否有交集
  6. 挂载报错:“/dev/vda1 is apparently in use by the system;”
  7. UITableView(二)
  8. repeater没有数据显示暂无数据,无记录
  9. Javascript String对象
  10. 配置追踪者—Scylla v1(***测试工具)