ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:25.16KB ,
资源ID:18908354      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18908354.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(inheritWord下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

inheritWord下载.docx

1、 Derived *pd = &base;/ Error,派生类指针指向基类对象;pb-show();/Ok,但输出 derived;print();/Error. 不可调用仅派生类有的方法; typedef void (Derived:*Pderived)(); Pderived pmend = & Base:show;/ Ok,基类成员的指针赋值给派生类成员的指针 (derived.*pmend)(); / 使用派生类成员指针 typedef void (Base:*Pbase)();Pbase pmenb = & Derived:/ Error.派生类成员的指针赋值给基类成员的指针rei

2、nterpret_cast, C-style cast or function-style castdynamic_castclass B /*.*/ virtual void f();class V /*.*/ virtual void g();class X /* no virtual functions */;class D:public B,public virtual V,public virtual X /.;void foo(D& d) B* pb=&d; D* p1=(D*)pb; /ok,unchecked D* p2=dynamic_cast(pb); /ok,run-ti

3、me checked V* pv=& D* p3=(D*)pv; /error:cannot cast from virtual base D* p4=dynamic_cast(pv); X* px=& D* p5=(D*)px; D* p6=dynamic_cast(px);cant cast from non-polymorphic type1. reinterpret_cast可以转换任意一个32bit整数,包括所有的指针和整数。可以把任何整数转成指针,也可以把任何指针转成整数,以及把指针转化为任意类型的指针,威力最为强大!但不能将非32bit的实例转成指针。总之,只要是32bit的东东

4、,怎么转都行!2. static_cast和dynamic_cast可以执行指针到指针的转换,或实例本身到实例本身的转换,但不能在实例和指针之间转换。static_cast只能提供编译时的类型安全,而dynamic_cast可以提供运行时类型安全。举个例子:3. classa;classb:c。4. 上面三个类a是基类,b继承a,c和ab没有关系。5. 有一个函数voidfunction(a&a);6. 现在有一个对象是b的实例b,一个c的实例c。7. function(static_cast(b)可以通过而function(static(c)不能通过编译,因为在编译的时候编译器已经知道c和a

5、的类型不符,因此static_cast可以保证安全。8. 下面我们骗一下编译器,先把c转成类型a9. b&ref_b=reinterpret_castb&c;10. 然后function(static_cast(ref_b)就通过了!因为从编译器的角度来看,在编译时并不能知道ref_b实际上是c!11. 而function(dynamic_cast(ref_b)编译时也能过,但在运行时就失败了,因为dynamic_cast在运行时检查了ref_b的实际类型,这样怎么也骗不过去了。12. 在应用多态编程时,当我们无法确定传过来的对象的实际类型时使用dynamic_cast,如果能保证对象的实际类

6、型,用static_cast就可以了。至于reinterpret_cast,我很喜欢,很象c语言那样的暴力转换:)13. dynamic_cast:动态类型转换14. static_cast:静态类型转换15. reinterpret_cast:重新解释类型转换16. const_cast:常量类型转换17. synamic_cast一般用在父类和子类指针或应用的互相转化;18. static_cast一般是普通数据类型(如intm=static_cast(3.14);19. reinterpret_cast很像c的一般类型转换操作20. const_cast是把cosnt或volatile属

7、性去掉21. 22. .23. 24. 泛型(GenericTypes)25. 26. floatf12.3;27. float*pf&f;28. /staticcast29. 成功编译,n12 30. intstatic_cast(pf);32. /成功编译 33. void*pvvoid*34. /成功编译,但是*pn2是无意义的内存(rubbish) 35. int*pn236. 37. /错误,编译器知道你应该调用static_cast38. /inti39. *pn实际上是无意义的内存,和*pn2一样 40. pi简而言之,static_cast将尝试转换,举例来说,如float-到

8、-integer,而reinterpret_cast(pX);73. CompileOK,butpY2isnotCBaseX 74. 不是CBaseX 75. 76. Systemcrash!77. 系统崩溃!78. pY2-bar();正如我们在泛型例子中所认识到的,如果你尝试转换一个对象到另一个无关的类static_cast将失败,而reinterpret_castCDerived* 86. /成功编译,隐式static_cast(pY1);91. 8.(int)pD1);92. 9.93. 10.reinterpret_cast 94. 不是95. 11.(pD);96. 12.(int

9、)pY2);97. 13.98. 14.无关的99. 15.pY3CBaseY();100. 16.(int)pY3);101. 成功编译,尽管只是一个新CBaseY()102. 17.pD3(pY3);103. 18.(int)pD3);-输出-104. 392fb8105. 392fbc106. 107. 108. 390ff0109. 390fec110. 注意:在将CDerived*用隐式转换到CBaseY*(第5行)时,结果是(指向)CDerived*(的指针向后)偏移了4(个字节)(译注:4为int类型在内存中所占字节数)。为了知道static_cast实际如何,我们不得不要来看一

10、下CDerived的内存布局。111. 112. CDerived的内存布局(MemoryLayout)view plaincopy to clipboardprint?1. 如图所示,CDerived的内存布局包括两个对象,CBaseXCBaseY,编译器也知道这一点。因此,当你将CDerived*转换到CBaseY*时,它给指针添加4个字节,同时当你将CBaseY*转换到CDerived*时,它给指针减去4。然而,甚至它即便不是一个CDerived你也可以这样做。2. 当然,这个问题只在如果你做了多继承时发生。在你将CDerived转换到CBaseX时static_cast是没有区别的。3

11、. 4. 情况3:void*之间的向前和向后转换5. 6. 因为任何指针可以被转换到void*,而void*可以被向后转换到任何指针(对于static_cast- 22. 24. 一旦我们已经转换指针为void*,我们就不能轻易将其转换回原类。在上面的例子中,从一个void*返回CDerived*的唯一方法是将其转换为CBaseY*然后再转换为CDerived*。26. 但是如果我们不能确定它是CBaseY*还是CDerived*,这时我们不得不用dynamic_cast或typeid2。28. 注释:29. 1.dynamic_cast,从另一方面来说,可以防止一个泛型CBaseY*被转换到

12、CDerived*。30. 2.需要类成为多态,即包括“虚”函数,并因此而不能成为void*。31. 参考:32. 1.MSDNC+LanguageReference-Casting33. 2.NishantSivakumar,BasicsUsecastsinyourVC+.NETprograms34. 3.JuanSoulie,Tutorial:Type使用标准C+的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。1 static_cast该运算符把expression转换为type-id类型,但没有运行时类型检查来保证

13、转换的安全性。它主要有如下几种用法:用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。不需要有虚函数用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。把空指针转换成目标类型的空指针。把任何类型的表达式转换成void类型。static_cast不能转换掉expression的const、volitale、或者_unaligned属性。2 dynamic_cast用法:dynamic_cast

14、 ( expression )该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。class B int m_iNum; virtual void foo();class D:public B char *m_szName100;void func(B *pb) D *pd1 = static_cast D *pd2 = dynamic_cast在上面的代码段中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的;但是,如果pb指向的是一个B类型的对象,那么pd1将是一个指向该对象的指针,对它进行D类型的操作将是不安全的(如访问m_szName),而pd2将是一个空指针。dynamic_cast使用时要有虚函数,否则会编译出错;static_cast则

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1