继承中的对象模型
- 通过查看子类的内存大小
- 通过Developer Command Prompt查看结构
山中问答
李白 〔唐代〕
问余何意栖碧山,笑而不答心自闲。
桃花流水窅然去,别有天地非人间。
- 无论哪种继承方式,父类中的private成员在子类中均不可以访问。
- public继承中,父类中public和protected权限到子类中不变。
- protected继承中,父类中的public和protected权限到子类中变为protected。
- private继承中,父类中的public和protected权限到子类中变为private。
那么问题来了,父类中的private成员,是不是并不属于子类对象中呢?
可无法在子类中访问它,又该如何去验证呢?
- 看内存大小
- 看对象结构图
结论先呈上:
- 父类中所有非静态成员属性都会被子类继承。
- 父类中私有的成员属性在子类中被编译器隐藏,虽访问不到,但是确实继承了。
通过查看子类的内存大小
code:
#include <iostream>
using namespace std;
class Base
{
public:
int m_a;
protected:
int m_b;
private:
int m_c;
};
class Son : public Base
{
public:
int m_d;
};
void test_inherit_object_model()
{
cout << "sizeof Son: " << sizeof(Son) << endl;
}
int main()
{
test_inherit_object_model();
system("pause");
return 0;
}
result:
sizeof Son: 16
通过Developer Command Prompt查看结构
- 在vs的安装路径下打开Developer Command Prompt执行文件,进入代码所在的路径。
- cl /d1 reportSingleClassLayoutAlpaca rhombus_inherit.cpp