考虑下面的钻石场景:
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 中的代码。