对象模型

在一个继承类中,继承的子类将会把父类的所有可继承的成员和属性都继承下来

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Father {
  5. protected:
  6. int m_a;
  7. private:
  8. int m_b;
  9. };
  10. class Son :public Father {
  11. public:
  12. int m_c;
  13. };
  14. int main() {
  15. return 0;
  16. }

在这个类中,Son类将父类的所有变量都继承了下来
在VS2019提供的开发者命令提示符中,可以使用报告单个类模型来查看具体的继承情况和对象模型
命令提示语法为:

  1. cl /d1 reportSingleClassLayout[ClassName] [FileName]

例如上述文件中,命令提示符将会打印:

  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 Father)
  8. 0 | | m_v
  9. 4 | | m_a
  10. | +---
  11. 8 | m_d
  12. +---
  13. Microsoft (R) Incremental Linker Version 14.27.29112.0
  14. Copyright (C) Microsoft Corporation. All rights reserved.
  15. /out:LearnCpp.exe
  16. LearnCpp.obj

我们可以看多次继承后的情况

  1. class Father {
  2. protected:
  3. int m_a;
  4. private:
  5. int m_b;
  6. };
  7. class Son :public Father {
  8. public:
  9. int m_c;
  10. };
  11. class GrandSon : public Son {
  12. int m_e;
  13. int m_f;
  14. };

多次嵌套后依然继承了所有成员

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

构造与析构顺序

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Father {
  5. public:
  6. Father() {
  7. cout << "父类进行构造" << endl;
  8. }
  9. ~Father() {
  10. cout << "父类进行析构" << endl;
  11. }
  12. private:
  13. int m_b;
  14. };
  15. class Son :public Father {
  16. public:
  17. Son() {
  18. cout << "子类进行构造" << endl;
  19. }
  20. ~Son() {
  21. cout << "子类进行析构" << endl;
  22. }
  23. int m_c;
  24. };
  25. void example() {
  26. Son s1;
  27. }
  28. int main() {
  29. example();
  30. return 0;
  31. }

打印结果:

  1. 父类进行构造
  2. 子类进行构造
  3. 子类进行析构
  4. 父类进行析构

继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反