1006继承03继承中的对象模型

121 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

1 问题抛出

子类可以继承父类中所有共性的内容,到了子类中这些共性的内容到底属不属于子类的对象呢?我们子类在继承父类之后,再打印子类对象,此时子类对象占内存空间是多少呢?

2 问题解决方法一

示例:

using namespace std;
class fat
{
public:
	int a;
protected:
	int b;
private:
	int c;
};

//私有继承
class Son :private fat
{
public:
	int d;
};

void test()
{
	Son son;
	cout << "size of son = " << sizeof(son) << endl;
}


int main() {

	test();

	system("pause");

	return 0;
}

输出: size of son = 16 请按任意键继续. . . 结论: 在父类中不管什么属性,子类都会继承下来,保留一份,并且子类自身的对象也算一份。父类中非静态成员属性都会被子类继承下去,父类私有成员属性是被编译器隐藏了,因此访问不到,但是实际上还是被子类继承下去了。

2 问题解决方法二

利用开发人员命令提示工具查看对象模型

1 先点击windows徽标,打开开发人员命令提示工具

1659702071558.png

2 有可能当前的目录不是你现在所写程序的目录,所以首先要跳转盘符 E:

3 跳转文件路径 cd(空格)...具体路径下;然后回车,再利用dir命令查看当前目录里的文件有哪些。

1659702483636.png

4 编写命令,查看代码的对象模型

cl(L)空格/d1空格reportSingleClassLayout查看的类名 所属文件名

1659703118488.png

结论: 父类中私有成员也是被子类继承下去了,只是由编译器给隐藏后访问不到

3.继承时的对象内存模型

虚继承:在继承定义中包含了virtual关键字的继承关系;
虚基类:在虚继承体系中的通过virtual继承而来的基类,需要注意的是:
class CDerive : public virtual CBase {}; 其中CBase称之为CDerive的虚基类,而不是说CBase就是个虚基类,因为CBase还可以为不是虚继承体系中的基类。

虚函数被派生后,仍然为虚函数,即使在派生类中省去virtual关键字。

虚基类的构造与析构是由最终子类负责调用的(而不是直接派生子类)

注:【下文中_vbptr即_vbtptr】

#对象内存布局分类讨论

vc6变量查看器中(Locals,Watch1等),也可以看到部分对象布局的情况(不完整,且虚继承是错误的)。

vs2005及以后版本的编译器提供了 /d1reportSingleClassLayout[类名] 编译选项来查看对象完整的内存布局: