我无法理解为什么抽象类有虚表。我知道这个问题出现在以下帖子下,我阅读了这些帖子,请耐心等待:
VTABLE for abstract classes C++
Does an abstract classes have a VTABLE?
Why does an abstract class have a vtable?
这是我知道的: 当我通过基类的指针使用派生对象时,vtables 用于启用多态行为。如果我现在调用该基类的虚方法,它将转到基类的虚表,查看它所指向的对象的真实类型,并寻找最接近该方法的专用重写并使用该方法。如果一个类至少包含一个纯虚函数,则它是抽象的,这意味着它不能被实例化。如果它不能被实例化,我就不能创建一个基指针,所以我不能以多态方式使用它?那么为什么它能够有一个虚表呢?
最佳答案
If it cannot be instanciated I cannot create a base pointer
这就是您的推理偏离轨道的地方。无法实例化并不意味着您无法创建基指针。一个最小的例子:
struct B {
virtual void foo() = 0;
};
struct D : B {
void foo() override {};
};
int main(){
D d;
B* ptr = &d; // base pointer to abstract class
}
So why would it be able to have a vtable?
这样虚函数调用就可以分派(dispatch)到具体子类中的实现。再想想,这就是 vptr 的一般用途。
抽象基的虚表可以用来实现dynamic_cast
。它也可以用于从基类的构造函数或析构函数调用纯虚函数的情况,因为在这些情况下 vptr 还不会指向派生的 vtable。
关于c++ - 抽象类总是拥有一个虚表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54534339/