虚继承会导致子类的大小增加4个字节(VS2008编译器),即使子类没有任何新成员。虚继承加上多重继承,同样又会导致增加4个字节。看下面的示例代码:
class WndPtr{
public:
int handle;
};
class IWnd : public virtual WndPtr{
;
};
class ListBoxPtr : public virtual WndPtr{
;
};
class ICtrl : public IWnd{
;
};
class ListBox : public ICtrl,public ListBoxPtr{
;
};
sizeof(WndPtr) = 4
sizeof(IWnd) = 8
sizeof(ListBoxPtr) = 8
sizeof(ICtrl) = 8
sizeof(ListBox) = 12
不知道是不是为了避免错误的类型转换。比如:如果ICtrl和ListBox大小一样,那么这个两个类型指针就可以自由转换,但是ICtrl并不包含ListBoxPtr的函数和成员,这种转换是不允许的。如果强制转换,虽然ListBoxPtr的handle其实就是ICtrl的handle,但是调试模式下,无法查看ListBoxPtr的成员。