1. class Base {
    2. public:
    3. int a = 100;
    4. };
    5. class Derived : public Base {
    6. public:
    7. int a = 200;
    8. };
    9. int main() {
    10. Derived d;
    11. cout << "sizeof(int) = " << sizeof(int) << ", ";
    12. cout << "sizeof(d) = " << sizeof(d) << endl;
    13. cout << "d.a = " << d.a << ", d.Base::a = " << d.Base::a << ", d.Derived::a = " << d.Derived::a << endl;
    14. cout << "d.Base::a 的地址为" << (&d.Base::a) << endl << "d.Derived::a 的地址为" << (&d.Derived::a);
    15. return 0;
    16. }

    输出

    1. sizeof(int) = 4, sizeof(d) = 8
    2. d.a = 200, d.Base::a = 100, d.Derived::a = 200
    3. d.Base::a 的地址为0x70fdf0
    4. d.Derived::a 的地址为0x70fdf4

    所以这就产生的多继承的二义性问题

    1. class Base {
    2. public:
    3. int a = 0;
    4. };
    5. class Derived1 : public Base {
    6. public:
    7. int b1 = 100;
    8. };
    9. class Derived2 : public Base {
    10. public:
    11. int b2 = 200;
    12. };
    13. class Derived : public Derived1, public Derived2 {
    14. public:
    15. int c = 200;
    16. };
    17. int main() {
    18. Derived d;
    19. cout << "sizeof(int) = " << sizeof(int) << ", ";
    20. cout << "sizeof(d) = " << sizeof(d) << endl;
    21. //cout << d.a << endl; // 存在二义性
    22. //cout << d.b1 << endl;
    23. //cout << d.b2 << endl;
    24. //cout << d.c << endl;
    25. return 0;
    26. }

    结果

    1. sizeof(int) = 4, sizeof(d) = 20

    可以推断出,在派生类Derived的对象d中,保存了 2个a ,1个b1,1个b2,1个c,其中2个a分别是从类 Derived1Derived2 继承来的。
    此时语句 cout << d.a << endl; 存在二义性,无法编译通过。
    但是 cout << d.Derived1::a << d.Derived2::a << endl; 可以通过
    Derived1 与· Derived1 的继承修改位虚继承后,编译可以通过。