派生类需要多少空间?如果它本身和它的基类都有虚拟方法

How much space does a Derived class cost?If itself and its base class both have virtual methods?

本文关键字:基类 方法 虚拟 它本身 多少 空间 如果 派生      更新时间:2023-10-16

我正在使用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;
}

结果是

尺寸A4
尺寸B 4
尺寸C8
尺寸D 12

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

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

CCD_ 2和CCD_ 3一样。

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

D继承自具有彼此不相关的虚拟方法的两个基类,因此D获得两个vtable指针(每个基类一个),加上来自C的4字节整数。因此总共12个字节。