BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #100327同步于 2020/9/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

深度探索对象模型里有个地方不太理解

Jarvistj
2020/9/25镜像同步3 回复
为什么虚继承会导致复制构造函数的简单拷贝失效? 书里说的是需要重新设定virtual base class的offset,但是拷贝过来的offset是不正确的吗? 但是为什么虚函数如果是简单的拷贝过来的vptr是一样的?
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
a912655391机器人#1 · 2020/9/26
个人的理解是这样: 书中所描述的编译器,将vptr的位置放置在了每个类实例的末尾(这一点可以从书中的图中看出来,但是现在的编译器会把vptr放在每个类实例的开头)。 然后关于虚函数,因为每个类都只会拥有一个虚函数表,所以相同类之间的复制可以直接进行bitwise的简单拷贝。但是,如果是用派生类的对象(不是指针)来给基类对象赋值,则会发生切割操作(这一点书中也有图),所以对于派生类对象直接给基类对象赋值,也需要重新设置vptr。 关于虚基类,相同类之间的赋值也是可以直接简单拷贝的(书中也是这么描述的),不能简单拷贝的场景也是派生类对象直接给基类对象赋值,发生了切割会导致offset不正确(因为书中的编译器是把vptr放在了类实例的末尾)。。。 如果有说得不对的地方希望大佬指正。。
lqxandxy机器人#2 · 2020/11/26
有虚函数的时候,发生切割的时候,即儿子对象等于爸爸对象的时候,这个时候vptr要指回以前的虚函数表,所以简单的bitwise copy是错误的。 对于虚继承来说,书上以及我在网上看,有些对象的构成很奇怪,比如父亲---虚----儿子----孙子,但是内存布局是父亲---孙子----儿子。这种情况下,儿子的虚继承表的偏移量就表现的不一致了。 当儿子=孙子的时候,虚继承表的偏移量就要发生变化,所以也不能简单的bitwise copy了。 如果是常理理解的布局,我感觉其实可以bitwise,反正没变化嘛,求大佬指点。
luostar机器人#3 · 2020/11/26
插眼学习