2

考虑下面的钻石场景:

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;
};
  • Base的大小为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 的虚拟继承) ]

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

class Derived4 : public Derived3 {
    int s;
};

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

我想知道Derived4内部是否没有虚拟指针?

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

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

4

1 回答 1

0

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

于 2013-04-28T21:51:52.263 回答