班上有多个vtable吗?

时间:2014-03-26 08:40:06

标签: 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中,我们有vptr到一个vtable,由A + C的方法组成,另一个vtable由B的方法组成。例如x64 build:

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

Class C有两个vtable实例:

  1. 用于调用自己的虚拟方法和覆盖A
  2. 的方法
  3. 用于B
  4. 的呼叫覆盖方法

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

1 个答案:

答案 0 :(得分:1)

C ++标准并没有说明应如何实现。它是由编译器决定的,如果它通过使用多个vtable来实现它,将vtable结合起来[以这种方式它们可以"拆分"再次,因为C必须再次成为B类型对象]。

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

很明显,这是一种流行的方法,但标准并没有说明应如何做到这一点。

将来,这可能会改变 - 有人可能会提出一个更好的不同解决方案(通过更好的定义 - 例如占用更少的空间,更快的访问等)