关于C++面向对象编程(下)第一次作业的问题

题目是这样的:

题目:分别给出下面的类型Fruit和Apple的类型大小(即对象size),并通过画出二者对象模型图以及你的测试来解释该size的构成原因。

关于C++面向对象编程(下)第一次作业的问题_第1张图片

分析:

从图中的代码可以知道,第一,Apple是子类,继承自Fruit;那么子类中包含了父类所有的内容;第二,在子类和父类中都有虚函数,那么对象的模型中就有虚指针(vptr),指向的是虚表(vtbl);第三,要考虑内存对齐的原则,这和C语言的结构体一样;我找到了关于内存对齐的资料,来自《C和指针》:

关于C++面向对象编程(下)第一次作业的问题_第2张图片
关于C++面向对象编程(下)第一次作业的问题_第3张图片
关于C++面向对象编程(下)第一次作业的问题_第4张图片

这一点我做题目的时候没有想到,另外我查了一下关于内存对齐的一篇文章,我觉得写的很好:《5分钟搞定内存字节对齐》

那么我可以画出初步的模型了:可以根据Visual Studio中的设置断点调试可以看到虚指针的地址;

关于C++面向对象编程(下)第一次作业的问题_第5张图片
关于C++面向对象编程(下)第一次作业的问题_第6张图片
更正:图中Fruit f的vptr地址应为0x137cc78,下图也是

接下来再考虑内存对齐的问题:

关于C++面向对象编程(下)第一次作业的问题_第7张图片

经过测试,确实如理论所言;

更多测试的方法可以参考下面这篇文章,非常感谢叶卡的文章,十分详尽,学到了很多东西:Geekband C++面向对象高级编程 第四周作业

你可能感兴趣的:(关于C++面向对象编程(下)第一次作业的问题)