C++ 虚拟继承情况下的vtable

C++ 虚拟继承情况下的vtable,c++,inheritance,virtual,C++,Inheritance,Virtual,在虚拟继承的情况下,vtable有什么用途(或者为什么需要vtable)?在本例中,此vtable指向什么 例如: class A { void show() { } }; class B : virtual A { void disp() { } }; 在上面的示例中,类B的大小是8字节。这意味着B类的vptr指向一个Vtable。这个vtable指向什么关键字的任何类都将为它创建一个VTABLE,并且该类的每个实例都将包含指向该(单个)VTABLE的指针。

在虚拟继承的情况下,vtable有什么用途(或者为什么需要vtable)?在本例中,此vtable指向什么

例如:

class A
{
    void show()
    { }
};

class B : virtual A
{
    void disp()
    { }
};

在上面的示例中,类B的大小是8字节。这意味着B类的vptr指向一个Vtable。这个vtable指向什么关键字的最常用方式——使用<代码>虚拟< /Cord>关键字的任何类都将为它创建一个VTABLE,并且该类的每个实例都将包含指向该(单个)VTABLE的指针。vtable包含有关对象的动态类的信息(以支持
动态强制转换
类型信息
),以及有关类的虚拟基类和函数所在位置的信息


在这个特定的情况下,<>代码> b>代码>的VTABLE可能包含动态类信息,因为<代码> A/C++ >没有数据成员或虚拟函数。因此,这些概念是特定于编译器的。你在哪个编译器上试过这个?GCC和Clang将其用于typeinfo。vtable由指向函数的指针组成,所以它指向的基本上是机器代码块。@melpomene,OP实际要问的是:在没有任何虚拟函数的正常继承情况下,大多数编译器都不需要vtable。在这个场景中,没有虚拟函数,但仍然有一个vtable,这对他来说很奇怪。@Frank,是的,这正是我的问题。我已经读到,这些vtable指向类A的子对象。这是真的吗?请注意,您只能在多态类上使用

dynamic_cast
typeinfo
,而不能在具有虚拟基的类上使用,例如
B
,即使在许多(但不是所有)编译器上,这些类的底层机制都是完全存在的。