class Base {public:int a = 100;};class Derived : public Base {public:int a = 200;};int main() {Derived d;cout << "sizeof(int) = " << sizeof(int) << ", ";cout << "sizeof(d) = " << sizeof(d) << endl;cout << "d.a = " << d.a << ", d.Base::a = " << d.Base::a << ", d.Derived::a = " << d.Derived::a << endl;cout << "d.Base::a 的地址为" << (&d.Base::a) << endl << "d.Derived::a 的地址为" << (&d.Derived::a);return 0;}
输出
sizeof(int) = 4, sizeof(d) = 8d.a = 200, d.Base::a = 100, d.Derived::a = 200d.Base::a 的地址为0x70fdf0d.Derived::a 的地址为0x70fdf4
所以这就产生的多继承的二义性问题
class Base {public:int a = 0;};class Derived1 : public Base {public:int b1 = 100;};class Derived2 : public Base {public:int b2 = 200;};class Derived : public Derived1, public Derived2 {public:int c = 200;};int main() {Derived d;cout << "sizeof(int) = " << sizeof(int) << ", ";cout << "sizeof(d) = " << sizeof(d) << endl;//cout << d.a << endl; // 存在二义性//cout << d.b1 << endl;//cout << d.b2 << endl;//cout << d.c << endl;return 0;}
结果
sizeof(int) = 4, sizeof(d) = 20
可以推断出,在派生类Derived的对象d中,保存了 2个a ,1个b1,1个b2,1个c,其中2个a分别是从类 Derived1 与 Derived2 继承来的。
此时语句 cout << d.a << endl; 存在二义性,无法编译通过。
但是 cout << d.Derived1::a << d.Derived2::a << endl; 可以通过
将 Derived1 与· Derived1 的继承修改位虚继承后,编译可以通过。
