虚继承下的sizeof大小疑惑

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{};

多重继承采用菱形继承,以上的AB哪一个才是对的?我在《深度探索C++对象模型》看到是A这种,但是g++和msvc对A都会warning,而B就不会:

clipboard.png

//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,Bsizeof操作是多少?我在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
阅读 3.7k
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题