abstract 类 总是拥有一个 vtable 吗?
Do abstract classes always own a vtable?
我无法理解为什么抽象 classes 有虚表。我知道这个问题出现在以下帖子下,我阅读了这些帖子,请耐心等待:
VTABLE for abstract classes C++
Does an abstract classes have a VTABLE?
Why does an abstract class have a vtable?
这是我所知道的:
当我通过基 class 的指针使用派生对象时,vtables 用于启用多态行为。如果我现在调用该 base class 的虚拟方法,它将转到 base 的 vtable 查看它指向的对象的真实类型,并寻找最接近该方法的专门覆盖并使用该方法。如果 class 包含至少一个纯虚函数,则它是抽象的,这意味着它不能被实例化。如果它不能被实例化,我就不能创建一个基指针,所以我不能以多态方式使用它?那么为什么它能够有一个虚表呢?
If it cannot be instanciated I cannot create a base pointer
这就是您的推理偏离 rails 的地方。无法实例化并不意味着您无法创建基指针。一个最小的例子:
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?
以便可以将虚函数调用分派到具体子类中的实现。再想想,这就是 vptr 的一般用途。
抽象基的vtable可以用来实现dynamic_cast
。它也可以用于从基类的构造函数或析构函数调用纯虚函数的情况,因为在这些情况下 vptr 还不会指向派生的 vtable。
我无法理解为什么抽象 classes 有虚表。我知道这个问题出现在以下帖子下,我阅读了这些帖子,请耐心等待:
VTABLE for abstract classes C++
Does an abstract classes have a VTABLE?
Why does an abstract class have a vtable?
这是我所知道的: 当我通过基 class 的指针使用派生对象时,vtables 用于启用多态行为。如果我现在调用该 base class 的虚拟方法,它将转到 base 的 vtable 查看它指向的对象的真实类型,并寻找最接近该方法的专门覆盖并使用该方法。如果 class 包含至少一个纯虚函数,则它是抽象的,这意味着它不能被实例化。如果它不能被实例化,我就不能创建一个基指针,所以我不能以多态方式使用它?那么为什么它能够有一个虚表呢?
If it cannot be instanciated I cannot create a base pointer
这就是您的推理偏离 rails 的地方。无法实例化并不意味着您无法创建基指针。一个最小的例子:
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?
以便可以将虚函数调用分派到具体子类中的实现。再想想,这就是 vptr 的一般用途。
抽象基的vtable可以用来实现dynamic_cast
。它也可以用于从基类的构造函数或析构函数调用纯虚函数的情况,因为在这些情况下 vptr 还不会指向派生的 vtable。