关于继承的一个问题,派生类对象中的基类部分和自身部分不连续具体上是如何实现的?

xuwenyc 2014-04-14 09:44:51
如题,自己有一个想法,但是不知道正确与否,书上也没有看到,所以向各位高人求证。如有错误,请用力拍砖
首先,比如一个正常的类A,里面有两个int类型a和b。那么对于一个具体的A类对象a1,它拥有的成员a和b的地址对于a1的地址是有一个固定偏移量的,那么操作a1.a和a1.b自然是很直观的。
但是,如果有一个基类A(数据成员int a),它有一个派生类B(自身定义的数据成员int b),那么派生类B的对象b1包含两部分,分别是基类部分和派生部分,而这两部分是不必连续排列的。那么就带来了内部成员相对派生类对象的偏移量不确定的问题。
然后我想到的一个可能是,编译器在创造一个派生类对象b1时,实际上时创造了两个子对象,分别是基类子对象ba和派生部分子对象bb,这里基类子对象内的成员和派生类子对象内的成员相对于各自对象的地址偏移量就是确定的了。
在操作的时候,b1.a这种操作实际上执行的是ba.a,而b1.b这种操作实际上被编译器替换成了操作bb.b

表达能力欠佳,不知道描述的是否正确,还望指教
...全文
96 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuwenyc 2014-04-15
  • 打赏
  • 举报
回复
引用 6 楼 fengxuxing 的回复:
你说的问题并没有你想象的那么简单的. (然后我想到的一个可能是,编译器在创造一个派生类对象b1时,实际上时创造了两个子对象)这句话是错的,只会产生一个对象,该对象的内存布局是确定的。 对于成员变量,基本上是连续的内存来放置,并不会出现什么中间有一个内存区域把成员分隔开了。 但是,内存布局并非只有成员变量,还有加入虚函数产生的虚表指针和避免diamond型多继承使用虚继承加入的虚基类指针。 如果你有兴趣,可以研读一下这篇博文,希望对你有用。 http://blog.csdn.net/hopedengxiwang/article/details/6942099
非常感谢,果然是篇好文章!不过我的主要思想就是创造子对象的目的是为了得到确定的子对象地址,而如果对象内存布局确定的话,就说明子对象对于主对象的偏移量也是确定的,也就相当于子对象的地址确定了。
Qlaiaqu 2014-04-14
  • 打赏
  • 举报
回复
你说的问题并没有你想象的那么简单的. (然后我想到的一个可能是,编译器在创造一个派生类对象b1时,实际上时创造了两个子对象)这句话是错的,只会产生一个对象,该对象的内存布局是确定的。 对于成员变量,基本上是连续的内存来放置,并不会出现什么中间有一个内存区域把成员分隔开了。 但是,内存布局并非只有成员变量,还有加入虚函数产生的虚表指针和避免diamond型多继承使用虚继承加入的虚基类指针。 如果你有兴趣,可以研读一下这篇博文,希望对你有用。 http://blog.csdn.net/hopedengxiwang/article/details/6942099
turing-complete 2014-04-14
  • 打赏
  • 举报
回复
有一个宏可以协助您的学习。 http://en.cppreference.com/w/cpp/types/offsetof
xuwenyc 2014-04-14
  • 打赏
  • 举报
回复
引用 1 楼 mougaidong 的回复:
您这个问题,如果仅考虑但继承的情况下,那是很容易理解的。 如果,问的是多继承的情况,那还是有点内容可以讨论的。
多继承难道不是类似地生成多个基类部分的子对象,然后加上派生类部分的子对象么?
Pump天天学习 2014-04-14
  • 打赏
  • 举报
回复
我一直以为都是连续排列的 virtual继承除外
Morrisss_ 2014-04-14
  • 打赏
  • 举报
回复
看看《深入探讨C++对象模型》。。这本书对这种问题应该有一些介绍。
turing-complete 2014-04-14
  • 打赏
  • 举报
回复
您这个问题,如果仅考虑但继承的情况下,那是很容易理解的。 如果,问的是多继承的情况,那还是有点内容可以讨论的。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧