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

  • 多重继承
    在这里插入图片描述
namespace ObjectMultiDerived {
  class Point2d {
  	public:
  		// has virtual functions
  		virtual void print() {};
  	private:
  		float _x;
  		float _y;
  };

  class Point3d : public Point2d {
  	public:
  		// ...
  	private:
  		float _z;
  };

  class Vertex {
  	public:
  		// has virtual functions
  		virtual void print() {};
  	private:
  		Vertex* next;
  };

  class Vertex3d : public Point3d, public Vertex {
  	public:
  		// ...
  	private:
  		float mumble;
  }; 
  void test()
  { 
  	cout << "Point2d类、Point3d类、Vertex、Vertex3d类的大小:" << sizeof(Point2d) << " " 
  	<< sizeof(Point3d) << " " << sizeof(Vertex) << " " << sizeof(Vertex3d) << endl;
  }
}
ObjectConDerived::test();//Point2d类、Point3d类、Vertex、Vertex3d类的大小:12 16 8 28

在这里插入图片描述

Vertex3d v3d; 
Point2d* p2d;
Point3d* p3d; 

//直接拷贝地址 
p2d = &v3d;
p3d = &v3d;

//需要调整this指针的位置
Vertex* pv;
Vertex3d *pv3d;
pv = pv3d; //编译器伪码为:pv = (Vertex*) ( ((char*)pv3d) + sizeof(Point3d));
pv = &v3d; // 编译器伪码为:pv = (Vertex*) ( ((char*)&v3d) + sizeof(Point3d));

【引用】
[1]: <<深度探索C++ 对象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 译
[2]: 代码地址 https://github.com/thefistlei/cplusStudy.git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

thefist11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值