c++面向对象高级编程 作业2

发布时间:2019-07-03 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了c++面向对象高级编程 作业2脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

class Fruit{test
   int no;
   double weight;
   char key;
public:
   void PRint() {   }
   virtual void process(){   }
};
   
class Apple: public Fruit{
   int size;
   char tyPE;
public:
   void save() {   }
   virtual void process(){   }
};

当类里面存在虚函数时,这个类所占的内存就会比没有虚函数时候大一点,大的位置是在类的成员变量前面会多出一个指针(vptr),它指向虚指针表(vtbl),虚指针表里面的每一个指针再指向对应的虚函数。从而实现动态绑定。
在数据存储时,由于内存是按照最小块分配的,且根据c++标准,成员的内存顺序与代码的定义顺序相同,且在初始化子类的对象时,会先初始化父类的对象,再初始化子类的对象。
测试代码如下:

#include <iostream>
using namespace std;
class Fruit
{
public:
    int no=10;
    double weight;
    char key;
public:
    void print(){}
    virtual void process(){}
};
class Apple: public  Fruit
{
public:
    int size;
    char type;
public:
    void save(){}
    virtual void process(){}
};
int main()
{
    cout<<"Fruit大小="<<sizeof(Fruit)<<endl;
    cout<<"Apple大小="<<sizeof(Apple)<<endl;
    cout<<"int 大小="<<sizeof(int)<<endl;
    cout<<"double 大小="<<sizeof(double)<<endl;
    cout<<"char 大小="<<sizeof(char)<<endl;
    Fruit s1;
    Apple a1;
    cout<<sizeof(s1)<<"-"<<sizeof(a1)<<endl;
    cout<<"s1-"<<sizeof(s1) << "-"<<&s1<<endl;
    cout<<"s1.no-"<<sizeof(s1.no)<<"-"<<&s1.no<<endl;
    cout<<"s1.weight-"<<sizeof(s1.weight)<<"-"<<&s1.weight<<endl;
    cout<<"s1.key-"<<sizeof(s1.key)<<"-"<<(void*)&s1.key<<endl;
    cout<<"a1.no-"<<sizeof(a1.no)<<"-"<<&a1.no<<endl;
    cout<<"a1.weight"<<sizeof(a1.weight)<<"-"<<&a1.weight<<endl;
    cout<<"a1.key-"<<sizeof(a1.key)<<"-"<<(void*)&a1.key<<endl;
    cout<<"a1.size-"<<sizeof(a1.size)<<"-"<<&a1.size<<endl;
    cout<<"a1.type-"<<sizeof(a1.type)<<"-"<<(void*)&a1.type<<endl;
    return 0;
}

使用cb编译器mingw32-gcc-4.7.1的运行结果如下:

c++面向对象高级编程 作业2


二者的对象模型图如下

c++面向对象高级编程 作业2


由于是32位版本,因此根据运行结果int类型大小为4,double为8,char大小为1.
又由于内存对齐原则。其内存模型应如下图所示:

c++面向对象高级编程 作业2


虚函数表指针大小与int类型相同为4,32位最小分配内存为8,不足8会补足,因此
Fruit大小等于4+4+8+4=20补足8的倍数为24.
Apple大小等于4+4+8+4+4+4=28补足8倍数为32.
使用vs MSBuild运行结果如下:

c++面向对象高级编程 作业2


内存图如下:

c++面向对象高级编程 作业2

vs为64位,所以指针为8字节因此这种情况下
Fruit大小为 8+8+8+8=32
Apple大小为 8+8+8+8+8=40

脚本宝典总结

以上是脚本宝典为你收集整理的c++面向对象高级编程 作业2全部内容,希望文章能够帮你解决c++面向对象高级编程 作业2所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。