我读到很多人写道“虚表存在于一个声明了虚函数的类中”。
我的问题是,vtable是只存在于具有虚函数的类,还是也存在于从该类派生的类。
e.g
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();问:如果没有派生类的vtable,那么输出就不会是“派生打印”。所以,对于任何声明了虚函数的类,以及从该类继承的类,都存在一个vtable。这是正确的吗?
发布于 2010-02-01 07:05:59
就仅考虑特定于虚函数的功能而言,在vtable实现的传统方法中,当且仅当派生类覆盖至少一个虚函数时,该派生类才需要vtable的单独版本。在您的示例中,Derived覆盖了虚拟函数print。由于Derived有自己的print版本,因此Derived vtable中的相应条目与Base vtable中的条目不同。这通常需要为Derived创建一个单独的vtable。
如果Derived根本没有覆盖任何东西,在形式上它仍然是一个单独的多态类,但是为了使它的虚函数正常工作,我们也可以简单地为Derived重用Base vtable。因此,从技术上讲,不需要为Derived创建单独的vtable。
然而,在实际实现中,我们通常称为"vtable“的数据结构通常也包含一些额外的类特定信息。额外的信息是特定于类的,以至于在大多数情况下,即使它们使用相同的虚拟函数集,也不可能在层次结构中的不同类之间共享vtable。例如,在一些实现中,存储在每个多态对象中的vtable指针指向数据结构,该数据结构还存储关于类的所谓的"RTTI信息“。因此,在大多数(如果不是所有的)实际实现中,每个多态类都有自己的vtable,即使这些表中存储的虚函数指针恰好是相同的。
发布于 2010-02-01 05:49:58
是的,你的理解是正确的。任何具有任何虚函数的基类都有一个vtable。
发布于 2010-02-01 05:56:05
是的是真的。实际上,给定base的定义:
class derived:public base{
public:
void print(){cout<<"derived print\n";}
};完全等同于:
class derived:public base{
public:
virtual void print(){cout<<"derived print\n";}
};..。因为您已经在base中将print定义为virtual。
我希望编译器能强制执行...
https://stackoverflow.com/questions/2173493
复制相似问题