Fra*_* Q. 20 c++ virtual-functions derived-class vtable
我读了很多人写的"一个虚拟表存在于一个已经在其中声明了虚函数的类".
我的问题是,vtable是仅存在于具有虚函数的类还是存在于从该类派生的类中.
例如
class Base{
public:
virtual void print(){cout<<"Base Print\n";}
};
class Derived:public Base{
public:
void print(){cout<<"Derived print\n";}
};
//From main.cpp
Base* b = new Derived;
b->print();
Run Code Online (Sandbox Code Playgroud)
问题:如果没有派生类的vtable,那么输出就不会是"派生打印".所以IMO存在一个vtable,用于任何已声明虚函数的类,也存在于从该类继承的类中.它是否正确 ?
AnT*_*AnT 19
至于仅考虑特定于虚函数的功能,在vtable实现的传统方法中,当且仅当该派生类重写至少一个虚函数时,派生类才需要单独的vtable版本.在您的示例中,Derived覆盖虚函数print.由于Derived有自己的版本print,Derivedvtable中的相应条目与vtable中的条目不同Base.这通常需要一个单独的vtable Derived.
如果Derived没有覆盖任何东西,正式它仍然是一个单独的多态类,但为了使其虚函数正常工作,我们也可以简单地重用Basevtable Derived.因此,从技术上讲,不需要单独的vtable Derived.
但是,在实际实现中,我们通常称为"vtable"的数据结构通常还包含一些其他类特定信息.额外信息是特定于类的,大多数情况下,即使它们使用相同的虚拟函数集,也无法在层次结构中的不同类之间共享vtable.例如,在一些实现中,存储在每个多态对象中的vtable指针指向还存储关于该类的所谓"RTTI信息"的数据结构.出于这个原因,在大多数(如果不是全部)实际实现中,每个多态类都获得自己的vtable,即使存储在这些表中的虚函数指针碰巧是相同的.