对象模型
在一个继承类中,继承的子类将会把父类的所有可继承的成员和属性都继承下来
#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.cpp
class Son size(12):
+---
0 | +--- (base class Father)
0 | | m_v
4 | | m_a
| +---
8 | m_d
+---
Microsoft (R) Incremental Linker Version 14.27.29112.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:LearnCpp.exe
LearnCpp.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.cpp
class GrandSon size(20):
+---
0 | +--- (base class Son)
0 | | +--- (base class Father)
0 | | | m_a
4 | | | m_b
| | +---
8 | | m_c
| +---
12 | m_e
16 | m_f
+---
Microsoft (R) Incremental Linker Version 14.27.29112.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:LearnCpp.exe
LearnCpp.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;
}
打印结果:
父类进行构造
子类进行构造
子类进行析构
父类进行析构
继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反