我有问题要理解为什么抽象类有虚函数表。我知道,这个问题已经提出了在以下职位,这是我看了这么多包涵了一下:
VTABLE for abstract classes C++
Does an abstract classes have a VTABLE?
Why does an abstract class have a 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
}
所以,为什么能够有虚表?
这样虚函数调用就会被分派到具体子类的实现。 关于第二个想法,这是vptr的是什么一般。
抽象基的虚表可以被用来实现dynamic_cast
。它也可以使用,在纯虚函数被从构造或基座的析构函数调用的情况下,作为在这些情况下的vptr将尚未指向衍生虚表。