虚拟表正是为Diamond继承中的哪个类创建的
Virtual table is exactly created for which class in Diamond Inheritance?
考虑以下代码片段:
class A
{
};
class B:public virtual A
{
};
class C:public virtual A
{
};
class D:public B,public C
{
};
int main()
{
cout<<sizeof(A)<<" "<<sizeof(B)<<" "<<sizeof(C)<<" "<<sizeof(D));
return 0;
}
我得到的输出为:
1 4 4 8
由于vptr
的创建,类B
和C
的大小是4个字节。这是否意味着virtual table
是为类B
和C
创建的?A
呢?
通常,编译器会为哪些类创建菱形继承中的virtual table
创建虚拟表的决定是编译器特定的吗
请在上面的例子或任何其他更好的例子的背景下回答。
是的,具有虚拟基的类需要某种类型的vtable或等价物。您需要一些机制来在运行时查找实际的基子对象!(请记住,虚拟基本子对象是最派生的对象的责任,而不是直接继承的对象的责任。)
如果编译器生成VTABLES,他将为任何需要VTABLES的类(包含虚拟函数…)生成
A不需要VTABLE=>size==1[最小尺寸]
B需要一个=>大小==4[您使用的是32位…]
C也需要一个=>大小==4
D也需要一个=>大小==8(2个条目,每个VTABLE D引用一个)
将为B、C和D创建虚拟表。B和C各有一个VPTR,D有两个VPTR。一个指向VTable的B部分,另一个指向VT的C部分。
注意:VTable不是强制性的,只要继承关系能够正确建模,编译器就可以提供自己的实现。(但是大多数编译器实现VTables)
没有任何内容表明编译器有为任何类创建vptr
。也就是说,在现实生活中,编译器生成vptr
s的原因有两个:
- 虚拟调度(显而易见)
- RTTI,例如
dynamic_cast
要求的RTTI(不那么明显)
通常,类的vtable
中的一个条目将指向某种"类型信息"结构,该结构为RTTI的工作提供了足够的信息。
正是这些信息使编译器能够计算出如果将B*
、C*
、D*
中的任何一个强制转换为A*
该怎么办,因此对于B
和C
,需要vptr
。CCD_ 20简单地聚合了两者。
- 如何创建从同一类继承的不同对象的向量
- 如果'C'公开继承'B',B 私下继承'A',为什么我不能在"C"中创建"A"的对象?
- 如何创建没有特定定义的随机分布?uniform_int_distribution是从其他类继承的吗?
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- 了解虚拟继承类 vtables 和 vptr 创建
- 如何从继承的父类创建unique_ptr
- 创建一个具有两个可能继承的类
- 如何创建一个继承自 std::vector 的类
- 是否有可能有一个派生类继承最终函数但创建相同的函数(而不是重写)
- 创建一系列超类的指针,以分配继承的类
- 如何创建从版本继承的CMAKE配置类型
- 动态创建一个继承的类,使用STD :: MAP使用基类指针访问
- 创建一个函数,该函数返回具有现有类继承的不同类型
- 如何允许一个类由另一个类创建而不使用'friend'但允许继承?
- 创建继承自C++中io类的异常类
- 你能在不使用C++进行子类型划分的情况下创建继承吗
- 自动创建继承的实例
- 如何在c++中从头文件中的类创建继承类
- 怀疑自创建继承类的链接问题
- 如何在c++中创建继承结构时设置父成员