浅度探索C++对象模型_bin3.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MinGW VS2008 VS2008 为什么探索C++对象模型 谢谢:-D 知识回顾Knowledge Review 哈工大信息检索研究中心 哈工大信息检索研究中心 浅度探索C++对象模型 Coding Group 张文斌 2010-11-21 主要内容 简介 单个类 单一继承 多重继承 虚拟继承 参考文献 深度探索C++对象模型 Stanley B. Lippman C++对象的内存布局 陈皓 C++对象模型学习笔记 钟声 C++对象的实现技术 刘斌武 C++简史 在20世纪80年代初期发明,C++是由美国贝尔实验室的Bjarne Stroustrup博士发明,在C语言的基础上,借鉴了Simula语言中面向对象的特征 1998年国际标准组织(ISO)颁布了C++的国际标准,通常称作ANSI/ISO C++ 下一次标准更新原定是在2009年,一般称该标准C++0X,但是由于对新特性的争端激烈,完整的标准还遥遥无期 由于C++语言过于复杂,以及经历了长年的演变,直到现在(2010年)都没有一个编译器完全符合标准 目前最接近C++标准的编译器有GNU GCC 4.5.0和Visual Studio 2010等 为什么探索C++对象模型 满足对C++底层实现机制的好奇 更好地使用C++ 找工作 各种问题 virtual有哪些用法? 虚函数是怎么实现的? 某个类对象占有多大存储空间? ...... 面向对象的特征-抽象性 抽象性是将具有一定关联的数据结构(属性)和行为(操作)的对象抽象成类,隐藏对象的属性和实现细节,仅对外公开接口 面向对象的特征-继承性 继承性是子类自动共享父类数据结构和方法的机制 面向对象的特征-多态性 表现在继承中?方法的重写(overwrite) 多个子类从同一父类继承而来,每个子类可以重写父类的某个方法被重写的方法在不同的子类中有不同的形式 例:动物会叫,因此人、猫、狗都会叫,但叫的方法不同 表现在一个类中?方法的重载(override/overload) 一个类有多个同名的方法,但这些方法的参数个数或类型不一样 例:人吃不同的东西采用不同的形式 实验环境 Visual Studio 2008 MinGW Developer Studio 2.05 gcc 3.3.1 代码示例 问题:sizeof(Base) 是多少? 内存布局 static成员独立于对象 非static数据成员存放在每个对象中 static数据成员存放在对象之外 所有的成员函数存放在对象之外 对虚函数的支持 每一个类维护一个虚函数表(vtbl),其中存放指向虚函数的指针 类的每一个对象维护一个指向vtbl的指针vptr,可以通过vptr调用虚函数 内存布局示例 Base::Base() static int Base::getCount() static int Base::count Base::show() vtbl char c vptr int x object sizeof(Base)=12 指向数据成员的指针 static数据成员的地址 Point::count与 point.count等价都指向内存中的实际地址 nonstatic数据成员的的地址 取一个nonstatic数据成员的地址,得到它在类中的偏移量,它们必须与具体的对象绑定才能取具体的值 int Point::*px = Point::x 取一个绑定于对象身上的nonstatic数据成员的地址将得到内存中该变量的实际地址 int * p = point.x Nonstatic成员函数的处理 nonstatic函数必须和具体的对象绑定后才能使用,经过编译器的转换后,它和非成员函数没有分别 转换过程如下 在参数列表中安插一个额外的参数this指针 将函数体内对每一个nonstatic数据成员的存取操作转换为经由this指针来存取 经过name mangling处理后,将该成员函数转换为一个外部函数 VS2008 Mangling实例 Static成员函数 静态成员函数没有this指针,它不需要通过一个对象来调用 不能够直接存取其类中的nonstatic成员 不能够声明为const, virtual 不需要经由类对象来调用 虚函数的使用 必须使用引用或指针调用虚函数,才能表现出多态 用派生类对象直接对基类对象进行初始化或赋值将发生切割 char c vptr char c vptr int x Base::f() Derive::f() 单个类 class 对于数据的封装不需要额外的开销 单一继承 类似单个类 Parent Child GrandChild 带虚函数的单一继承 带虚函数的单一继承 Parent Child 带虚函数的单一继承 GrandChi

文档评论(0)

文档分享 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档