从具有虚函数的多个继承类派生的类的大小

时间:2013-04-28 21:04:34

标签: c++ codeblocks virtual-inheritance diamond-problem

考虑下面的钻石情景:

class Base {
    int x;
public:
    virtual ~Base(){}
};

class Derived1 : virtual public Base {
    int y;
};

class Derived2 : virtual public Base {
    int z;
};

class Derived3 : public Derived1, public Derived2 {
    int t;
};
  • 基础的大小 8 [ x(4)+ vptr(4)(来自虚拟析构函数)]
  • Derived1 的大小为 16 [ x(4)+ y(4)+ vptr(4)(来自虚拟析构函数)+ vptr(4) (来自虚拟继承)]
  • Derived2 的大小为 16 [ x(4)+ z(4)+ vptr(4)(来自虚拟析构函数)+ vptr(4) (来自虚拟继承)]
  • Derived3 的大小 28 [ x(4)+ y(4)+ z(4)+ t(4)+ vptr(4) (来自虚拟析构函数)+ 2次vptr(4)(来自Derived1和Derived2的虚拟继承)]

现在,如果我添加另一个类 Derived4 ,它派生自 Derived 3

class Derived4 : public Derived3 {
    int s;
};

它的大小 32 (我假设 Derived3 + s的大小)。

我想知道 Derived4 中是否有虚拟指针?

如果我采用普通的类层次结构(没有菱形结构),那么如果基类具有虚函数,则所有派生类都具有vptrs。那么,为什么不在这种情况下?

我正在用GNU GCC编译器编译codeBlocks 12.11中的代码。

1 个答案:

答案 0 :(得分:0)

由于Derived4没有添加任何虚拟函数或虚拟基类,除了从Derived3继承的内容之外,大小的唯一增加是成员s。