C++程序设计 教学课件 作者 张桦第8章 RTTI与异常处理.ppt

C++程序设计 教学课件 作者 张桦第8章 RTTI与异常处理.ppt

ID:50041227

大小:442.00 KB

页数:37页

时间:2020-03-08

C++程序设计 教学课件 作者 张桦第8章 RTTI与异常处理.ppt_第1页
C++程序设计 教学课件 作者 张桦第8章 RTTI与异常处理.ppt_第2页
C++程序设计 教学课件 作者 张桦第8章 RTTI与异常处理.ppt_第3页
C++程序设计 教学课件 作者 张桦第8章 RTTI与异常处理.ppt_第4页
C++程序设计 教学课件 作者 张桦第8章 RTTI与异常处理.ppt_第5页
资源描述:

《C++程序设计 教学课件 作者 张桦第8章 RTTI与异常处理.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C++程序设计第8章RTTI与异常处理8.1RTTI概述8.2dynamic_cast运算符8.3typeid运算符8.4异常8.5异常的使用8.6标准库的异常类8.7本章小结第8章RTTI与异常处理8.1RTTI概述RTTI(Run-TimeTypeIdentification,运行时类型识别),支持程序在运行时,根据基类指针或引用,确定其所指对象的实际类型。RTTI是RAD开发工具(如MFC)的基础。在处理异类容器,以及在实现调试器程序时,都需要在运行时得知对象的类型,而虚函数机制不能满足需求,那么如何确定对象的动态类型呢?C++为此提供的支

2、持是内建的RTTI运算符:dynamic_cast和typeid。8.1RTTI概述dynamic_cast运算符,支持程序在运行时,将基类指针安全转换成派生类指针,或把指向基类的对象安全转换成派生类的引用,所谓安全是指转换成功后所得的指针或引用是一定可用的。typeid运算符,获得指针或引用所指对象运行时的实际类型。8.2dynamic_cast运算符为什么需要dynamic_cast运算符?classEmployee{//雇员类,基类public:virtualintsalary();};classCaptain:publicEmployee

3、{//机长public:intsalary();};classStewardess:publicEmployee{//空姐public:intsalary();};8.2dynamic_cast运算符另外有一个如下的计算薪水全局函数payroll():intpayroll(Employee*pe){//使用pe->salary()}假设新需求是在payroll()的计算里,增加一项bonus,与salary()类似,不同类型员工的bonus()是不一样的。为此,可以在Employee类中增加一个bonus()虚成员函数,在计算payroll()时

4、,bonus()与成员函数salary()一起被使用,例如:8.2dynamic_cast运算符classEmployee{public:virtualintsalary();virtualintbonus();//在基类中增加虚函数};classCaptain:publicEmployee{public:intsalary();};classStewardess:publicEmployee{public:intsalary();intbonus();};intpayroll(Employee*pe){//使用pe->salary()和pe->

5、bonus()}8.2dynamic_cast运算符在类层次结构中增加虚函数bonus(),缺点是需要有类Employee、Captain和Stewardess的实现源代码,但如果上述的类层次结构是由第三方库提供的,没有其实现源代码,则无法采用增加基类虚成员函数方式。采用方法:可使用dynamic_cast,为用户在不方便或者不想改变基类的情况下,模拟虚函数机制。具体做法:直接向派生类(如Stewardess类)中增加bonus()成员函数。8.2dynamic_cast运算符classEmployee{public:virtualintsala

6、ry();};classCaptain:publicEmployee{public:intsalary();};classStewardess:publicEmployee{public:intsalary();intbonus();//在派生类中增加的非虚成员函数};8.2dynamic_cast运算符在函数payroll()中通过dynamic_cast运算符转换得派生类Stewardess的指针,并用这个指针,调用其增加的非虚成员函数Stewardess::bonus():intpayroll(Employee*pe){Stewardess

7、*pm=dynamic_cast(pe);if(pm){//pm指向Stewardess对象//用pm调用Stewardess::bonus()}else{//dynamic_cast失败,pm为0//使用pe调用Employee的成员函数}}8.2dynamic_cast运算符注意:在使用结果指针之前,必须测试dynamic_cast是否转换成功。例如:intpayroll(Employee*pe){Stewardess*pm=dynamic_cast(pe);staticintvariabl

8、ePay=0;//错误:在使用pm之前需要测试pm的值variablePay+=pm->bonus();//…}8.2dynamic_c

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。