虚拟基类是如何存储的
How is virtual base classes stored?
所以我理解,如果你有钻石继承问题,你做虚拟继承它只创建一个基类然而,这究竟是如何表示的?
在虚函数表中是否有一个指向基类的指针,当一个派生类被构造时,它会查看该指针是否已经存在,如果不存在,它会创建它并使其指向基类?
你从右边开始。尽管实现细节可能有所不同,但实际上虚函数表中(或者无论如何在类元数据中)有足够的信息来查找基类。
对于你的第二部分,我想在任何实现中都没有"查看指针是否已经存在"。c++使派生最多的类负责构造所有虚基。因此,对于涉及Root
, Middle1
, Middle2
和MostDerived
的正常菱形继承,用于构造MostDerived
实例的代码将:
- 构造
Root
并设置vptr指向MostDerived
的虚函数表 - 构建
Middle1
和Middle2
- 构建
MostDerived
的数据成员 - 执行
MostDerived
的构造函数体
我说"一个vptr"而不是"vptr",因为在Middle1
的构造过程中,Root
基类是可用的,但Middle1
的任何虚函数还没有引用MostDerived
中定义的覆盖。这取决于实现来解决这个问题,你可以自己实验一下,看看对象大小,有多少隐藏指针被用来做这件事,以及这个数字是否取决于Middle1
是否有虚函数。
请注意,通常用来构造Middle1
实例的代码将:
- 构造
Root
并设置vptr指向Middle1
的虚函数表 - 构建
Middle1
的数据成员 - 执行
Middle1
的构造函数体
当我们构造MostDerived
的Middle1
基类子对象时,我们只想执行其中两个步骤,而不是全部三个步骤。由于这个原因,您可能会发现具有多个构造函数的类所发出的代码包含多个构造函数——一个用于派生类型为类的对象,另一个用于派生类型为类的基类子对象。
相关文章:
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 添加存储在向量中的大整数的函数出现问题
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 在std::vector上存储带有模板的类实例
- 谷歌测试中的期望值存储在哪里
- 为什么C中的通用链表中存储的数据已损坏
- 在c++中获取两个大int,并将它们存储在数组中
- 存储在存储在堆栈中的堆与矩阵中的矩阵可以看作是一系列指针