Jan*_*Jan 1 c++ abstract-class vtable
我有问题要理解为什么抽象类有vtable.我知道这个问题出现在以下帖子中,我读过这样的话,请耐心等待一下:
这就是我所知道的:当我通过基类的指针使用派生对象时,vtables用于启用多态行为.如果我现在调用该基类的虚方法,它将转到基础的vtable,查看它所指向的对象的实际类型,并查找该方法的最接近的专用覆盖并使用该方法.如果一个类包含至少一个纯虚函数,则该类是抽象的,这意味着它不能实例化.如果它无法实现,我无法创建一个基指针,所以我不能以多态方式使用它?那为什么它能够有一个vtable?
如果无法实现,我无法创建基指针
这是你的推理偏离轨道的地方.无法实例化并不意味着您无法创建基指针.一个最小的例子:
struct B {
virtual void foo() = 0;
};
struct D : B {
void foo() override {};
};
int main(){
D d;
B* ptr = &d; // base pointer to abstract class
}
Run Code Online (Sandbox Code Playgroud)
那为什么它能够有一个vtable?
这样就可以将虚函数调用分派给具体子类中的实现.第二个想法,这就是vptr的用途.
抽象基础的vtable可用于实现dynamic_cast.在从构造函数或基类的析构函数调用纯虚函数的情况下,也可以使用它,因为在这些情况下,vptr还不会指向派生的vtable.