C++中运行时类型信息(RTTI)及动态强制类型转换
2012-08-21 12:49:24 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劎绮妵鍕箳鐎n亞浠鹃梺闈涙搐鐎氫即鐛崶顒夋晬婵絾瀵ч幑鍥蓟閻斿摜鐟归柛顭戝枛椤牆顪冮妶搴′簼缂侇喗鎸搁悾鐑藉础閻愬秵妫冮崺鈧い鎺戝瀹撲礁鈹戦悩鎻掝伀缁惧彞绮欓弻娑氫沪閹规劕顥濋梺閫炲苯澧伴柟铏崌閿濈偛鈹戠€n€晠鏌嶆潪鎷屽厡闁汇倕鎳愮槐鎾存媴閸撴彃鍓卞銈嗗灦閻熲晛鐣烽妷褉鍋撻敐搴℃灍闁绘挻娲橀妵鍕箛闂堟稐绨肩紓浣藉煐濮樸劎妲愰幘璇茬闁冲搫鍊婚ˇ鏉库攽椤旂》宸ユい顓炲槻閻g兘骞掗幋鏃€鐎婚梺瑙勬儗閸樺€熲叺婵犵數濮烽弫鍛婃叏椤撱垹纾婚柟鍓х帛閳锋垶銇勯幒鍡椾壕缂備礁顦遍弫濠氱嵁閸℃稒鍊烽柛婵嗗椤旀劕鈹戦悜鍥╃У闁告挻鐟︽穱濠囨嚃閳哄啰锛滈梺褰掑亰閸欏骸鈻撳⿰鍫熺厸閻忕偟纭堕崑鎾诲箛娴e憡鍊梺纭呭亹鐞涖儵鍩€椤掑啫鐨洪柡浣圭墪閳规垿鎮欓弶鎴犱桓闂佸湱枪閹芥粎鍒掗弮鍫熷仺缂佸顕抽敃鍌涚厱闁哄洢鍔岄悘鐘绘煕閹般劌浜惧┑锛勫亼閸婃牠宕濋敃鈧…鍧楀焵椤掍胶绠剧€光偓婵犱線鍋楀┑顔硷龚濞咃絿妲愰幒鎳崇喓鎷犻懠鑸垫毐闂傚倷鑳舵灙婵炲鍏樺顐ゆ嫚瀹割喖娈ㄦ繝鐢靛У绾板秹寮查幓鎺濈唵閻犺櫣灏ㄥ銉р偓瑙勬尭濡繂顫忛搹鍦<婵☆垰鎼~宥囩磽娴i鍔嶉柟绋垮暱閻g兘骞嬮敃鈧粻濠氭偣閸パ冪骇鐎规挸绉撮—鍐Χ閸℃ê闉嶇紓浣割儐閸ㄥ墎绮嬪澶嬪€锋い鎺嶇瀵灝鈹戦埥鍡楃仯闁告鍕洸濡わ絽鍟崐鍨叏濡厧浜鹃悗姘炬嫹

采用通用方式(即多态形式)编程时,如果想在运行时修改相应的派生类对象的信息,我们可以使用C++中强大的运行时类型信息机制,来完成相应派生类对象状态的改变。下面我们就来动态的改变BaseCommsionEmployee对象的状态,把它的基本工资在程序运行当中动态的增加10%。及动态的打印基类Employee指针所指派生类对象的的类型信息。
例:代码举例
#include <iostream>
#include <string>
#include <vector>//标准库中的容器头文件
#include <iomanip>//流格式设置
#include <typeinfo>//对象类型识别typeid函数定义处
#include "Employee.h"//雇员抽象类头文件
#include "BaseCommsionEmployee.h"//带有薪水外加拥金的雇员类 拥金就是从出售的产品中抽取一定的所得比例金额也就是提成
#include "CommsionEmployee.h"//只有拥金的雇员类
#include "HourlyEmployee.h"//小时雇员类,按相应小时计费
#include "WeekEmployee.h"//按周薪水雇员类,周薪固定
using namespace std;//命名空间std中的所有全局变量及函数
void ptrPrint(const Employee const *);//打印相应信息的函数原型,接收一个指向常量Employee对象的常量指针
//即进入这个函数内的实参状态不会被调用的函数所改变
int main(){
vector<Employee *> employee(4);//声明一个包含4个Employee*指针的数组的Vector容器对象
employee[0] = new CommsionEmployee("bai", "sunwu", "123456789",0.5, 10000);
employee[1] = new BaseCommsionEmployee("bai", "ruru", "987654321", 0.5, 10000, 3000);//动态申请一个baseCommsionEmployee对象
employee[2] = new WeekEmployee("bai", "sun","192837465", 4000);
employee[3] = new HourlyEmployee("bai", "wu", "00000000", 8, 100);//new 关键字返回相应对象的的指针
cout<<setprecision(2)<<fixed<<endl;//流输出格式的定义,所有数值的输出保留二位有效数值,并进行四舍五入
//此格式具有极强传递性,对下面的所有数值的输出都起作用
for(size_t j = 0; j < 4; j++){
//下面的语句动态的判断基类指针指向的派生类对象是不是相应的BaseCommsionEmployee类型,
//如果是,则把基类指针强制向下转换成派生类指针并赋值给basePtr指针变量,然后通过这个指针变量
//来调用只属于派生类对象的方法修改派生类对象的状态(即BaseCommsionEmployee对象相应基本工资增加10%
//如果基类指针所指不是BaseCommsionEmployee对象,则basePtr赋值为0
BaseCommsionEmployee * basePtr = dynamic_cast<BaseCommsionEmployee *>(employee[j]);
if(basePtr != 0){//判断是否是BaseCommsionEmployee对象
cout<<"Old baseCommsionEmployee sala = "<<basePtr->getBaseSalary()<<endl;
basePtr->setBaseSalary(1.1 * basePtr->getBaseSalary());
cout<<"After increame 10% ,Now baseCommsionEmployee baseSala = "<<basePtr->getBaseSalary()<<endl;
}
employee[j]->print();//多态的打印基类指针所指的派生类对象的方法,注意此方法必定是visual方法
cout<<"\nEarning = "<<employee[j]->earning()<<endl;
}
for(size_t i = 0; i < 4; i++){//多态的判断基类所指派生类对象的类型信息,并打印
更多精彩
赞助商链接