c++ - 一个类可以有多个虚表吗?

标签 c++ visual-c++ vtable

比如说,我们有这样的类继承

class A
{
    int a;
public:
    A(){}
    virtual void f1(){}
};

class B
{
    int b;
public:
    B(){}
    virtual void f2(){}
    virtual void f3(){}
};

class C: public A, public B
{
    int c;
public:
    C(){}
    virtual void f1(){}
    virtual void f2(){}
    virtual void f3(){}
    virtual void f4(){}
};

对象: C c;

在对象 c 中,我们有一个 vtable 的 vptr,由 A+C 的方法组成,另一个 vtable 由 B 的方法组成。例如 x64 构建:

  • +0:虚表A+C
  • +8: int a + padding to 8 byte
  • +16:虚表B
  • +24: int b + padding to 8 byte
  • +32: int c + padding to 8 byte

C 类 有两个 vtable 实例:

  1. 调用自己的虚方法和A的重写方法
  2. 用于调用 B 的覆盖方法

我对声明感到困惑,如果它是多态的,那么一个类就有一个 vtable

最佳答案

C++ 标准没有说明这应该如何实现。这取决于编译器是否通过使用多个 vtables 来完成,合并 vtables [以这样的方式它们可以再次“拆分”,因为 C 必须可以制作成 B 再次键入对象]。

在编译器中使用多个 vtables 是一个很常见的解决方案,所以你至少会在 MS 的 VC++、GNU 的 g++、LLVM/clang++ 和 ARM 的 armcc++ 中看到这种解决方案。因为我不知道它在其他编译器中是如何工作的,所以我不能说其他编译器是否使用这种方法(很可能)。

需要说明的是,这是一种流行的方法,但标准并没有说明应该如何完成。

在未来,这可能会改变 - 有人可能会提出更好的不同解决方案(根据更好的定义 - 例如占用更少的空间,访问速度更快等)

关于c++ - 一个类可以有多个虚表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22655440/

相关文章:

c++ - 从传递给构造函数的参数类型推导可变成员类型

c++ - 如何在 C++ 中获取当前时间(以毫秒为单位)?

visual-studio-2010 - 自重启应用程序在某些情况下崩溃

visual-c++ - 跟踪/监控 Windows 上的文件/文件夹复制事件

c++ - 如何解决 <<ClassName>> 的 "undefined reference to ` vtable 错误?

c++ - C++中每个类都有虚函数表吗

c++ - 在 C++ 构造函数中为结构数组分配存储空间

C++ 打印指针不确认 showbase

c++ - 运行时 "can' t 找到虚拟表的链接器符号的原因可能是什么...“Qt 中的错误?

c++ - Variadac 宏将宏应用于所有参数