- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入理解c对象模型第3章
第3章 Data语意学 回顾 1.Data Member的绑定 inline Member function躯体之内的一个data member绑定操作,会在整个class声明之后完成 2.Data Member的布局 (1)在同一个access section(也就是private、public、protected等区段)中,member排列需与其出现先后一致。 (2)编译器会把一个以上的access section连锁在一起,依照申明次序成为连续区块不会由Access sections的多寡招致额外负担。 3.Data Member的存取 Point3d origin,*pt=origin; origin.x = 0.0; pt-x = 0.0; 1)对于static Data Members其存取时间和效率是一致的。 2)对于Nonstatic Data Members若无继承,则一致,有继承则指针指向的变量会不确定是子类还是基类的值。 3.4 继承与Data Member 1.只要继承不要多态 又称为具体继承,其相对与虚拟继承,不会增加空间和额外的存取时间。 为了支持将子类的对象赋给父类时数据的一致性,需要将base class Member捆绑在一起。 具体继承的内存分配如下图所示: 2.加上多态 加入虚函数会引起的额外负担: 1)virtual table的引入。 2)在每个object中导入vptr。 3)加强的constructor对vptr赋合适初值。 4)加强的distructor,抹消vptr。 vptr在class object中存放的位置 1)vptr放于class object尾端(cfront编译器)优点是,支持struct,允许c程序代码的使用。缺点是,读vptr时需要从class object的起始点量起,且需知道offset。 2)Vptr放于class object的首端,优点是可以直接通过object的指针调用virtual function。缺点是不支持c struct。 3.多重继承 自然多态:派生类和基类有相同的起始地址,其差异仅为派生类空间大,用以存放多余的nonstatic data Member。 非自然多态:基类无虚函数,而派生类有,此时若vpt放于object的首端,则derived object-base object时需要编译器介入。 多重继承的非自然多态的情况下,派生类与第二或后继base class object之间的转换。 1)值传递 Vertex3d v3d; Vertex *pv; pv = v3d; 内部转换: pv = (Vertex *)((char *)v3d + sizeof(Point3d)); 2)指针 Vertex3d *pv3d; Vertex *pv; pv = pv3d; 内部转换: pv =pv3d ? (Vertex *)((char *)pv3d + sizeof(Point3d)) : 0; 注:引用不可能为0,而指针有可能为空,因此需要对指针进行判空操作。 4.虚拟继承 Class内含一个或多个virtual base class subojects ,将被分为两部分:一部分是不变 局部,一部分是共享局部。 不变局部:不管如何衍化,始终拥有固定的 offset ,因此这部分的数据可以直接存取。 共享局部:virtual base class subobjects这一部分数据,其位置会因为每次派生操作而改变,因此只能间接存取。 不同编译器主要是共享局部的间接存取方式不同,可分为以下三种: cfront编译器会在每个derived class object中安插一些指针指向virtual base class。存取继承得来的virtual base class Member通过相关指针间接完成。 缺点:1.每个对象必须将额外的virtual base class指针。 2.虚指针继承串连增加,则间接存取时间增加。 1)加入内嵌指针,可以减少时间 2).Microsoft引入virtual base class table 3)virtual function table,其中放置virtual base class的offset(正值索引virtual functions,负值索引virtual base class offsets
您可能关注的文档
最近下载
- 《家庭路由器密码修改.doc VIP
- 光伏施工电站施工质量管理体系及保证措施.docx VIP
- 退换货应急服务措施及保障.docx VIP
- 医疗器械公司组织机构图和部门设置说明【模板范本】.docx
- 2020年最新小学数学教师编制考试新课标测试题及答案(三).docx VIP
- 拼多多法律顾问岗面试题库参考答案和答题要点.docx VIP
- 腾讯法律顾问岗面试题库参考答案和答题要点.docx VIP
- 小米法律顾问岗面试题库参考答案和答题要点.docx VIP
- 网易法律顾问岗面试题库参考答案和答题要点.docx VIP
- 惠普HP DeskJet Ink Advantage Ultra 4800 系列参考指南.pdf
文档评论(0)