- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
类对象布局与内存分配及sizeof总结
基类,派生类, 虚基类,虚函数表 ,内存分配和布局Author: renkic声明:此文档大部分来自互联网,本人只是借用加以研究,以节省时间。但没有加链接,如有不妥,请告知ownregister@126.com, 谢谢。基本的类继承关系????? 内存分配时,是在于基类对象不同的内存地址处,按基类的成员变量类型,开辟一个同样的类型空间,但注意开辟后派生对象的空间,不是复制基类的成员的值,而是仅仅开辟那种成员类型的空间,未初始化时,里面存在的数是不确定的。1:派生类创建对象后调用了基类的构造函数,不是创建派生类对象的同时也创建了基类的对象。而是创建派生类对象时调用基类的构造函数对派生类中所继承自基类的部分初始化。2:派生类对象在内存中包含基类的私有变量,只是不能直接访问。3:从代码共享的角度看,组合类对象和派生类对象没有什么本质的不同,不同的是它们所表达的事物之间的逻辑关系:组合类对象一般表示“整体-部分”关系,而派生类对象一般表达“一般-具体”关系。? ???? 然后派生类自己定义的成员变量是排在继承的A类成员下面,如果派生类定义的变量名与基类相同,则此变量覆盖掉继承的基类同名变量,注意,覆盖不是删除,也就是派生类中继承自基类的成员变量依然存在,而且值也不发生变化。如果想用此继承自基类的成员变量,则要加:: ,在成员函数中访问时,直接用base::i,即可,用派生类的对象a访问时,如果此继承自基类的成员变量是对象可访问的(Public类型),则用 a.base::i访问之。#includestdafx.h#includeiostreamusingnamespace std;class A{public:long a;};class B: public A{public:long b;};void set(A * d, int idx){d[idx].a = 2;}int _tmain(int argc, _TCHAR* argv[]){B data[4];A array[3];for(int i=0; i4; i++){data[i].a = 1;data[i].b = 1;set(data, i);}for(int i=0; i4; i++){coutdata[i].adata[i].b;}coutendl;for(int i=0; i3; i++){array[i].a = 5;coutarray[i].aendl;}system(pause);return 0;}Vs2008中的对象布局:可以看出, 类A的对象和类B的对象各自有自己的存储空间。基类对象在派生类中作为子对象形式存在。实际在内存中的存放形式:0x0012FEE2 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc ......................0x0012FEF8 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc 03 00 ......................0x0012FF0E 00 00cc cc cc cc cc cc cc cc 04 00 00 00 cc cc cc cc cc cc cc cc ......................0x0012FF24 04 00 00 00 cc cc cc cc cc cc cc cc 05 00 00 00 05 00 00 00 05 00 ......................0x0012FF3A 00 00 cc cc cc cc cc cc cc cc 02 00 00 00 02 00 00 00 02 00 00 00 ......................0x0012FF50 02 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 cc cc ......................0x0012FF66 cc cc b8 ff 12 00 b8 1a 41 00 01 00 00 00 e8 5e 39 00 58 74 39 00 ........A......^9.Xt9.上图斜体加粗部分,最上边的三个数字时for循环开辟的i的空间, 下边三个5是A类的对象, 后边2,1都是B类的对象。又如:#includestdafx.h#includeiostreamusingnamespace std;class base{public:int i;int j;};class sub:public base{publ
文档评论(0)