比如说,我们有这样的类继承
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 实例:
- 调用自己的虚方法和A的重写方法
- 用于调用 B 的覆盖方法
我对声明感到困惑,如果它是多态的,那么一个类就有一个 vtable
最佳答案
C++ 标准没有说明这应该如何实现。这取决于编译器是否通过使用多个 vtables 来完成,合并 vtables [以这样的方式它们可以再次“拆分”,因为 C
必须可以制作成 B
再次键入对象]。
在编译器中使用多个 vtables 是一个很常见的解决方案,所以你至少会在 MS 的 VC++、GNU 的 g++、LLVM/clang++ 和 ARM 的 armcc++ 中看到这种解决方案。因为我不知道它在其他编译器中是如何工作的,所以我不能说其他编译器是否使用这种方法(很可能)。
需要说明的是,这是一种流行的方法,但标准并没有说明应该如何完成。
在未来,这可能会改变 - 有人可能会提出更好的不同解决方案(根据更好的定义 - 例如占用更少的空间,访问速度更快等)
关于c++ - 一个类可以有多个虚表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22655440/