1. class Base1 {
  2. public:
  3. int m_a;
  4. };
  5. class Base2 {
  6. public:
  7. int m_a;
  8. };
  9. class Son :public Base1,public Base2 {
  10. public:
  11. int m_b;
  12. };

该实例中,Son类继承了两个base,且都有同名成员变量ma;

  1. D:\C++\LearnCpp>cl /d1 reportSingleClassLayoutSon LearnCpp.cpp
  2. 用于 x86 Microsoft (R) C/C++ 优化编译器 19.27.29112
  3. 版权所有(C) Microsoft Corporation。保留所有权利。
  4. LearnCpp.cpp
  5. class Son size(12):
  6. +---
  7. 0 | +--- (base class Base1)
  8. 0 | | m_a
  9. | +---
  10. 4 | +--- (base class Base2)
  11. 4 | | m_a
  12. | +---
  13. 8 | m_b
  14. +---
  15. Microsoft (R) Incremental Linker Version 14.27.29112.0
  16. Copyright (C) Microsoft Corporation. All rights reserved.
  17. /out:LearnCpp.exe
  18. LearnCpp.obj

SingleClassLayout也指示了继承了两个类

多继承语法

C++允许一个类继承多个类
语法:class 子类 :继承方式 父类1 , 继承方式 父类2...
多继承可能会引发父类中有同名成员出现,需要加作用域区分
C++实际开发中不建议用多继承
示例:

  1. class Base1 {
  2. public:
  3. Base1()
  4. {
  5. m_A = 100;
  6. }
  7. public:
  8. int m_A;
  9. };
  10. class Base2 {
  11. public:
  12. Base2()
  13. {
  14. m_A = 200; //开始是m_B 不会出问题,但是改为mA就会出现不明确
  15. }
  16. public:
  17. int m_A;
  18. };
  19. //语法:class 子类:继承方式 父类1 ,继承方式 父类2
  20. class Son : public Base2, public Base1
  21. {
  22. public:
  23. Son()
  24. {
  25. m_C = 300;
  26. m_D = 400;
  27. }
  28. public:
  29. int m_C;
  30. int m_D;
  31. };
  32. //多继承容易产生成员同名的情况
  33. //通过使用类名作用域可以区分调用哪一个基类的成员
  34. void test01()
  35. {
  36. Son s;
  37. cout << "sizeof Son = " << sizeof(s) << endl;
  38. cout << s.Base1::m_A << endl;
  39. cout << s.Base2::m_A << endl;
  40. }
  41. int main() {
  42. test01();
  43. system("pause");
  44. return 0;
  45. }

总结: 多继承中如果父类中出现了同名情况,子类使用时候要加作用域