c++ - 抽象类总是拥有一个虚表吗?

标签 c++ abstract-class vtable

我无法理解为什么抽象类有虚表。我知道这个问题出现在以下帖子下,我阅读了这些帖子,请耐心等待:

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/

相关文章:

c++ - libcudart 和 gcc 的本地构建链接错误的 glibc

c++ - 关于 C/C++ 编译器优化,我可以假设什么?

oop - 接口(interface)和抽象类有什么区别?

c# - 在抽象类及其实现之间实现版本检查

java - 从通用抽象类创建派生实例列表

c++ - 从命名空间嵌入资源时出现问题(C++ 和 CMake)

c++ - 无法访问我的 UI 的小部件

C++ 继承问题 : undefined reference to 'vtable'

c++ - 派生类 vtable 已损坏?

c++ - VTBL在单继承和多继承中的区别