首先,Class A包含一个虚函数,所以sizeof(A)的结果是 sizeof(虚表)的大小,也就是4字节。
Class B继承Class A,所以Class B一定是包含Class A,只是包含的方式不同。
普通继承,Class A的虚表会和Class B的虚表合并,所以Class B中还是保留一个虚表就可以了。此时sizeof(B)的结果就是4.
虚继承,Class A和Class B的关系就会微妙很多。由于C++支持多继承,所以某些情况下会出现下图中的继承关系。这种水晶继承会导致Class D中包含两份Class A的对象。此时就会出现访问歧义的情况。
虚继承就可以避免上面的情况。Class A的数据会被放到虚表中。Class D会识别到来自Class B和C的虚表,然后将两者合并。所以回到本件问题,问题中的Class B就会包含一份虚函数表指针,一份虚类指针。也就是sizeof(B)的结果是8。