Question 1
class X {};
class Y : public virtual X {};
class Z : public virtual X {};
class A : public Y, public X {};
class B : public virtual Y, public virtual X{};
多重继承采用菱形继承,以上的A
和B
哪一个才是对的?我在《深度探索C++对象模型》看到是A
这种,但是g++和msvc对A都会warning,而B就不会:
//g++
warning: direct base 'X' inaccessible in 'A' due to ambiguity [enabled by default]
class A : public Y, public X {};
//msvc
warning C4584: “A”: 基类“X”已是“Y”的基类
Question 2
上面的A
,B
sizeof操作是多少?我在g++和msvc下的结果很奇怪。首先g++的指针是8而msvc是4,但是主要集中在以下两点
g++的sizeof(A) = 16, sizeof(B) = 8, 不相等!
msvc的sizeof(A) = 8, sizeof(B) = 8, 相等!
// g++
sizeof(pointer) = 8
sizeof(X) = 1
sizeof(Y) = 8
sizeof(Z) = 8
sizeof(A) = 16
sizeof(B) = 8
//msvc
sizeof(pointer) = 4
sizeof(X) = 1
sizeof(Y) = 4
sizeof(Z) = 4
sizeof(A) = 8
sizeof(B) = 8
直接给你推荐两篇文章吧
C++ 虚函数和虚继承浅析
虚函数与虚继承寻踪
看完应该就能懂了!