欢迎来到天天文库
浏览记录
ID:59256665
大小:178.94 KB
页数:18页
时间:2020-09-08
《c++对象内存分布.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、对象的影响因素 简而言之,我们一个类可能会有如下的影响因素: 1)成员变量2)虚函数(产生虚函数表)3)单一继承(只继承于一个类)4)多重继承(继承多个类)5)重复继承(继承的多个父类中其父类有相同的超类)6)虚拟继承(使用virtual方式继承,为了保证继承后父类的内存布局只会存在一份)上述的东西通常是C++这门语言在语义方面对对象内部的影响因素,当然,还会有编译器的影响(比如优化),还有字节对齐的影响。在这里我们都不讨论,我们只讨论C++语言上的影响。 本篇文章着重讨论下述几个情况下的C++对象的内存布局情况。 1)单一的一般继承(带成员变量、虚
2、函数、虚函数覆盖)2)单一的虚拟继承(带成员变量、虚函数、虚函数覆盖)3)多重继承(带成员变量、虚函数、虚函数覆盖)4)重复多重继承(带成员变量、虚函数、虚函数覆盖)5)钻石型的虚拟多重继承(带成员变量、虚函数、虚函数覆盖) 我们的目标就是,让事情越来越复杂。 知识复习 我们简单地复习一下,我们可以通过对象的地址来取得虚函数表的地址,如: typedef void(*Fun)(void); Baseb; FunpFun=NULL; cout<< "虚函数表地址:"
3、<<(int*)(&b)<4、主要使用如下编译器和系统:1)WindowsXP 和 VC++20032)Cygwin 和 G++3.4.4 单一的一般继承 下面,我们假设有如下所示的一个继承关系: 请注意,在这个继承关系中,父类,子类,孙子类都有自己的一个成员变量。而了类覆盖了父类的f()方法,孙子类覆盖了子类的g_child()及其超类的f()。 我们的源程序如下所示: class Parent{public: int iparent; Parent():iparent(10){} virtual void f(){cout<< " Parent::f()" 5、<6、g_child()" <7、_child()" <8、int**)&gc; cout<< "[0]GrandChild::_vptr->" <
4、主要使用如下编译器和系统:1)WindowsXP 和 VC++20032)Cygwin 和 G++3.4.4 单一的一般继承 下面,我们假设有如下所示的一个继承关系: 请注意,在这个继承关系中,父类,子类,孙子类都有自己的一个成员变量。而了类覆盖了父类的f()方法,孙子类覆盖了子类的g_child()及其超类的f()。 我们的源程序如下所示: class Parent{public: int iparent; Parent():iparent(10){} virtual void f(){cout<< " Parent::f()"
5、<6、g_child()" <7、_child()" <8、int**)&gc; cout<< "[0]GrandChild::_vptr->" <
6、g_child()" <7、_child()" <8、int**)&gc; cout<< "[0]GrandChild::_vptr->" <
7、_child()" <8、int**)&gc; cout<< "[0]GrandChild::_vptr->" <
8、int**)&gc; cout<< "[0]GrandChild::_vptr->" <
此文档下载收益归作者所有