Derived类占用多少空间?如果它自己和它的基类都有虚拟方法?

Yua*_*Wen 1 c++ inheritance

我正在使用vs2013(Win32)测试以下程序:

#include <iostream>

class A {
    virtual void funA();
};

class B {
    virtual void funB();
};

class C :public A{
    int i;
    virtual void funC();
};

class D :public B, C{
    virtual void funD();
};

int main(){
    std::cout << "size A " << sizeof(A) << std::endl;
    std::cout << "size B " << sizeof(B) << std::endl;
    std::cout << "size C " << sizeof(C) << std::endl;
    std::cout << "size D " << sizeof(D) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是

尺寸A 4
尺寸B 4
尺寸C 8
尺寸D 12

为什么sizeof(C)!= 8 + sizeof(A),sizeof(D)!= 4 + sizeof(B)+ sizeof(C)?

Joh*_*nck 6

A 是一个带有虚方法的单一基类,因此是一个vtable指针,因此在像你这样的32位平台上有4个字节.

B就像A.

C就像A加一个4字节整数一样.请注意,它仍然只有一个基类(A),这意味着仍然只有一个vtable指针.

D使用彼此无关的虚方法从两个基类继承,因此D获得两个vtable指针(每个基类一个),加上来自的4字节整数C.因此总共12个字节.