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