抽象类是否总是拥有一个vtable?

时间:2019-02-05 12:22:09

标签: c++ abstract-class vtable

我在理解为什么抽象类具有vtable时遇到问题。我知道这个问题已经出现在以下帖子中,我读了这些,请耐心等待:

VTABLE for abstract classes C++

Does an abstract classes have a VTABLE?

Why does an abstract class have a vtable?

这是我所知道的: 当我通过基类的指针使用派生对象时,vtables用于启用多态行为。如果现在调用该基类的虚方法,它将转到基的vtable,查看它所指向的对象的实际类型,并寻找该方法的最接近的专用替代并使用该方法。如果一个类至少包含一个纯虚函数,则该类是抽象的,这意味着无法实例化。如果无法实例化,则无法创建基本指针,因此无法以多态方式使用它?那为什么能有一个vtable?

1 个答案:

答案 0 :(得分:5)

  

如果无法实例化,则无法创建基本指针

这是您的推理偏离常规的地方。无法实例化并不意味着您无法创建基本指针。一个最小的例子:

struct B {
    virtual void foo() = 0;
};

struct D : B {
    void foo() override {};
};

int main(){
   D d;
   B* ptr = &d; // base pointer to abstract class
}
  

那为什么能有一个vtable?

因此可以将虚拟函数调用分派到具体子类中的实现。再三考虑,这就是vptr的一般用途。

抽象库的vtable可用于实现dynamic_cast。在从基础的构造函数或析构函数调用纯虚函数的情况下,也可以使用它,例如在那种情况下,vptr仍不会指向派生的vtable。