C++ 虚拟继承情况下的vtable
在虚拟继承的情况下,vtable有什么用途(或者为什么需要vtable)?在本例中,此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的指针。
class A
{
void show()
{ }
};
class B : virtual A
{
void disp()
{ }
};
在上面的示例中,类B的大小是8字节。这意味着B类的vptr指向一个Vtable。这个vtable指向什么在C++中,VTABLE是实现代码<虚拟V/COD>关键字的最常用方式——使用<代码>虚拟< /Cord>关键字的任何类都将为它创建一个VTABLE,并且该类的每个实例都将包含指向该(单个)VTABLE的指针。vtable包含有关对象的动态类的信息(以支持
动态强制转换
和类型信息
),以及有关类的虚拟基类和函数所在位置的信息
在这个特定的情况下,<>代码> b>代码>的VTABLE可能包含动态类信息,因为<代码> A/C++ >没有数据成员或虚拟函数。因此,这些概念是特定于编译器的。你在哪个编译器上试过这个?GCC和Clang将其用于typeinfo。vtable由指向函数的指针组成,所以它指向的基本上是机器代码块。@melpomene,OP实际要问的是:在没有任何虚拟函数的正常继承情况下,大多数编译器都不需要vtable。在这个场景中,没有虚拟函数,但仍然有一个vtable,这对他来说很奇怪。@Frank,是的,这正是我的问题。我已经读到,这些vtable指向类A的子对象。这是真的吗?请注意,您只能在多态类上使用
dynamic_cast
和typeinfo
,而不能在具有虚拟基的类上使用,例如B
,即使在许多(但不是所有)编译器上,这些类的底层机制都是完全存在的。