- 5
- 0
- 约1.72万字
- 约 72页
- 2016-08-15 发布于重庆
- 举报
7第七讲名空间和RTTI
* 要点: 介绍本章的主要内容。 * * * * * * * * * * * * * * * * * * * * * 引用的dynamic_cast dynamic_castT(p) 如果p不是T类型的,会抛出一个bad_cast异常 class B {}; class D: public B {}; void f( D d) { B b = dynamic_castB(d); } * 先激活RTTI,如果编译器没打开RTTI支持,你要打开它; 对象所属类型必须是多态类族; 若使用dynamic_cast转换一个引用,则要使用异常处理机制,因为它可能抛出 std::bad_cast异常; 若使用typeid (*p)来检索对象的类型信息,又恰碰 p == NULL时,将抛出std::bad_typeid异常; 当使用dynamic_cast运算符转换一个指针时,定要检查结果是否为NULL. 使用RTTI的注意事项 * RTTI的出现不仅解决了异常处理机制中的问题,还能完成虚函数不能完成的工作; RTTI的是个总的概念,它涵盖了如下内容: 运算符typeid 运算符dynamic_cast 一个记载了对象的类型信息的type_info类 还维护着一个继承树,它表明了多态类族的is a 关系。 但RTTI和虚函数不是一回事。因为虚函数的动态决议并没有使用type_info的信息。“早在RTTI特征于1993年被引入C++之前,C++对多态的唯一支持就是对虚函数的动态决议操作。有了RTTI后,就能够在运行时查询一个多态指针或引用指向的具体对象的类型了.” RTTI和虚函数 * class B { public: virtual float fun() { return 0.1; } }; class D :public B { ……} void main() { B *p = new D; B r = *p; //无名对象照样有别名 couttypeid(p)==typeid(B*); //仅指向子类中父类部分 couttypeid(p)!=typeid(D*); //而非指向整个子类对象 couttypeid(r)==typeid(D); //引用的类型却是子类的 couttypeid(*p)==typeid(D); //间址访问的是子类对象 couttypeid(*p)!=typeid(B); //而非父类 couttypeid(r)==typeid(B*); //引用的地址是父类的 couttypeid(r)!=typeid(D*); //而非子类的 } 用typeid分析指针与引用的区别 画出图示! 运行结果全是真,后面是解释。 * 对于函数模板可以这样调用: int m1 =MAX(10,15); 也可以这样调用: int m2 =MAXint(10,15); 这叫作显式调用。 这种形式和C++新增的四个cast运算符何其相似! 其实,这四个运算符就是四个函数模板。于是我们也可以如法炮制出我们需要的转换函数来。 从函数模板看四个转换运算符 templatetypename DestType,typename SrcType DestType static_cast( SrcType src) { return DestType( src); //使用C-style的强转 } 于是我们可用函数模板来自定义转换函数: templatetypename DestType,typename SrcType DestType My_cast( SrcType src) { return DestType( src); } C++将支持以下的调用: int * p = My_castint * (100); char c = My_castchar ,int (100); double p = My_castdouble,long (100); 函数模板可用来自定义转换函数 对于许多有过程编程背景的人来说,要他们不把程序组织成为一组switch语句非常困难。他们可能会运用RTTI来完成任务,但会在代码维护阶段丢失多态性的非常重要的价值。 C++的意图是:尽可能地使用虚函数,必要时才使用RTTI。当然,要想充分使用虚函数,我们必须控制基类的定义。但随着程序的扩大,我们可能发现基类并没有我们想要的虚函数,如果基类来自类库或其他由别人控制的来源,就可以用RTTI作为一种解决办法:我们可以派生一个新类,并加上我们的成员函数。在代码的其他地方可以检测到新增类型和调用的那个成员函数。这不会破
您可能关注的文档
- 6AModule1Unit2教案.doc
- 6BM1U3教案.doc
- 6HHX隧道灭菌烘箱验证方案.doc
- 6S推行实务与目视管理.doc
- 物联网感知层和传输层的安全问题.doc
- 6S推行管理办法(机械厂).doc
- 6S推行手册07718.doc
- 51102-02-02-003表4.4.2-4测量金属壁温的专用热电阻安装.doc
- 物联网技术的发展趋势.doc
- 6《怀念母亲》教学设计1份.doc
- 尼尔森IQ快消月报2025年12月.pdf
- 人民币汇率波动与美联储政策预期 2026.pdf
- 2026 Kimi-K2.5技术报告介绍.docx
- 新时代全球财政债务管理如何破局 2026.pdf
- 从“参与者”到“定价者”:人民币债市国际化如何乘势突围 2026.pdf
- 2026-2030中国无硅粉末消泡剂行业现状动态及发展趋势研究报告.docx
- 2026-2030中国共享充电宝市场消费调查与前景运营策略研究报告.docx
- 2025至2030中国NiemannPickC1Like蛋白1行业运营态势与投资前景调查研究报告.docx
- 2026-2030中国柔性线路板市场需求规模与竞争格局趋势预测研究报告.docx
- 2026年党章知识选粹选测试题(b卷).docx
最近下载
- 2025【燕京啤酒公司发展能力存在的问题及完善对策研究4900字】.doc VIP
- AXI4Spec中文版及常见问题解答_axi协议验证常见问题.docx
- 2024年四川省绵阳市中考数学试题卷(含答案解析).docx
- 大数据技术与应用专业人才需求分析和预测性调研报告.pdf VIP
- 眼科护士护理人员三基考核试题题库与答案.docx VIP
- JT∕T 1293-2019 客运码头安全管理基本要求(可复制版).pdf
- 常用封隔器技术原理.pptx VIP
- 高教社2026人工智能经济学教学课件Ch6.人工智能与要素市场.pptx VIP
- 2025年新能源安规(光伏)试卷及答案.docx VIP
- 山区行车安全培训.pptx VIP
原创力文档

文档评论(0)