我在理解为什么抽象类具有vtable时遇到问题。我知道这个问题已经出现在以下帖子中,我读了这些,请耐心等待:
VTABLE for abstract classes C++
Does an abstract classes have a VTABLE?
Why does an abstract class have a vtable?
这是我所知道的: 当我通过基类的指针使用派生对象时,vtables用于启用多态行为。如果现在调用该基类的虚方法,它将转到基的vtable,查看它所指向的对象的实际类型,并寻找该方法的最接近的专用替代并使用该方法。如果一个类至少包含一个纯虚函数,则该类是抽象的,这意味着无法实例化。如果无法实例化,则无法创建基本指针,因此无法以多态方式使用它?那为什么能有一个vtable?
答案 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。