对象模型
在一个继承类中,继承的子类将会把父类的所有可继承的成员和属性都继承下来
#include <iostream>#include <string>using namespace std;class Father {protected:int m_a;private:int m_b;};class Son :public Father {public:int m_c;};int main() {return 0;}
在这个类中,Son类将父类的所有变量都继承了下来
在VS2019提供的开发者命令提示符中,可以使用报告单个类模型来查看具体的继承情况和对象模型
命令提示语法为:
cl /d1 reportSingleClassLayout[ClassName] [FileName]
例如上述文件中,命令提示符将会打印:
D:\C++\LearnCpp>cl /d1 reportSingleClassLayoutSon LearnCpp.cpp用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.27.29112 版版权所有(C) Microsoft Corporation。保留所有权利。LearnCpp.cppclass Son size(12):+---0 | +--- (base class Father)0 | | m_v4 | | m_a| +---8 | m_d+---Microsoft (R) Incremental Linker Version 14.27.29112.0Copyright (C) Microsoft Corporation. All rights reserved./out:LearnCpp.exeLearnCpp.obj
我们可以看多次继承后的情况
class Father {protected:int m_a;private:int m_b;};class Son :public Father {public:int m_c;};class GrandSon : public Son {int m_e;int m_f;};
多次嵌套后依然继承了所有成员
用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.27.29112 版版权所有(C) Microsoft Corporation。保留所有权利。LearnCpp.cppclass GrandSon size(20):+---0 | +--- (base class Son)0 | | +--- (base class Father)0 | | | m_a4 | | | m_b| | +---8 | | m_c| +---12 | m_e16 | m_f+---Microsoft (R) Incremental Linker Version 14.27.29112.0Copyright (C) Microsoft Corporation. All rights reserved./out:LearnCpp.exeLearnCpp.obj
构造与析构顺序
#include <iostream>#include <string>using namespace std;class Father {public:Father() {cout << "父类进行构造" << endl;}~Father() {cout << "父类进行析构" << endl;}private:int m_b;};class Son :public Father {public:Son() {cout << "子类进行构造" << endl;}~Son() {cout << "子类进行析构" << endl;}int m_c;};void example() {Son s1;}int main() {example();return 0;}
打印结果:
父类进行构造子类进行构造子类进行析构父类进行析构
继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反
