继承与data member之多重继承
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之多重继承相关推荐
- 继承与 Data Member(2)
加上多态的情况 如果我要处理一个坐标点, 而不在意这是一个 Point2d 或 Point3d 实例, 那么就需要在继承关系中提供一个 virtual function 接口: class Point ...
- c++Data Member的绑定
Data Member的绑定 Data Member的绑定 Data Member的布局 Data Member的存取 继承与Data Member 含多态的继承 多重继承 虚继承 指向Data Me ...
- Data Member 的存取
考察以下代码: Point3d origin; origin.x = 0.0; 此例中 x 的存取成本是什么? 答案则是视 x 和 Point3d 而定(别打脸, 我知道这是废话). 具体的呢? 因为 ...
- 深度探索C++ 对象模型(6)-Data member的存取
nonstatic data member 需要在class object起始地址加上该member的偏移. class A {public: int x; int y;}; A a; a.y = 0 ...
- 深度探索C++ 对象模型(6)-Data member的绑定
防御性程序设计 1).将class声明起头处放data member; 代码示例: class Point3d{ float x,y,z; public://etc } 2). class的声明处放i ...
- Data Member 的绑定
考察以下代码: extern float _x;//user code class Point3d { public:Point3d(float, float, float);//问题来了, 是哪一个 ...
- 提示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 ...
- qt error: C2491: ‘ ::staticMetaObject‘: definition of dllimport static data member not all
场景: Qt 5.14.0 +MSVC2015 32位 ,使用qt导入外部库的时候,发现出现以下问题 error: C2491: ' ::staticMetaObject': definition o ...
- 深度探索C++ 对象模型(7)-Data member的布局(虚继承)
虚拟继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...
- 深度探索C++ 对象模型(7)-Data member的布局(多重继承)
多重继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...
最新文章
- Notepad2 一个很不错的记事本
- 新手篇——学习网页开发需要多长时间就能找到工作
- /bin/bash^M解决办法
- com.css.common.jdbcTemplate中的类
- C++中class与struct的区别
- saiku连mysql 使用_saiku应用的调试
- 老司机翻车现场:一个业余程序员组织如何收到滴滴的侵权通知?
- 英特尔处理器接连爆出漏洞,Intel:这次不打算修了
- 数学画图软件_关于数学建模(或科研绘图)的画图学习建议
- 走进MSTP -- 4. OSN7500/7500II/3500/1500硬件速览
- 皮尔逊相关系数_皮尔逊相关系数(Person)
- Windows 10微软应用商店打不开问题解决方案
- 2013年国考行测错题集(省级)
- 2011QQ搞笑个性签名:小弟不才,大名耶稣.小名上帝.法号如来
- 未来广告机面临的问题
- ios+android备份短信恢复软件下载,iPhone备份短信教程:iOS短信导出技巧大全
- 关于FTP获取文件,过滤器,下载文件0kb问题
- ChinaSkills-网络系统管理(2021年全国职业院校技能大赛B-1 模块 B:Windows 环境 评分标准 )
- 【机器学习】缺失值的处理方法总结
- アプリケーションコンポーネント(大分類)
热门文章
- ExecutorService中submit和execute的区别
- windows环境下kafka源代码开发环境搭建
- 你说你会用Companion object?恐怕不是!
- 前端技术周刊 2018-08-06:ES Module
- c# 判断两个集合是否有交集
- 挂载报错:“/dev/vda1 is apparently in use by the system;”
- UITableView(二)
- repeater没有数据显示暂无数据,无记录
- Javascript String对象
- 配置追踪者—Scylla v1(***测试工具)