C++中运行时类型信息(RTTI)及动态强制类型转换

2014-11-24 10:47:57 · 作者: · 浏览: 1

采用通用方式(即多态形式)编程时,如果想在运行时修改相应的派生类对象的信息,我们可以使用C++中强大的运行时类型信息机制,来完成相应派生类对象状态的改变。下面我们就来动态的改变BaseCommsionEmployee对象的状态,把它的基本工资在程序运行当中动态的增加10%。及动态的打印基类Employee指针所指派生类对象的的类型信息。


例:代码举例

#include
#include
#include //标准库中的容器头文件
#include //流格式设置
#include //对象类型识别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(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<

//此格式具有极强传递性,对下面的所有数值的输出都起作用
for(size_t j = 0; j < 4; j++){

//下面的语句动态的判断基类指针指向的派生类对象是不是相应的BaseCommsionEmployee类型,

//如果是,则把基类指针强制向下转换成派生类指针并赋值给basePtr指针变量,然后通过这个指针变量

//来调用只属于派生类对象的方法修改派生类对象的状态(即BaseCommsionEmployee对象相应基本工资增加10%

//如果基类指针所指不是BaseCommsionEmployee对象,则basePtr赋值为0
BaseCommsionEmployee * basePtr = dynamic_cast(employee[j]);
if(basePtr != 0){//判断是否是BaseCommsionEmployee对象
cout<<"Old baseCommsionEmployee sala = "<getBaseSalary()< basePtr->setBaseSalary(1.1 * basePtr->getBaseSalary());
cout<<"After increame 10% ,Now baseCommsionEmployee baseSala = "<getBaseSalary()< }
employee[j]->print();//多态的打印基类指针所指的派生类对象的方法,注意此方法必定是visual方法
cout<<"\nEarning = "<earning()< }

for(size_t i = 0; i < 4; i++){//多态的判断基类所指派生类对象的类型信息,并打印

//typeid函数定义在typeinfo头文件中,typeid()接收一个类型对象,此函数返回一个typeinfo对象,调用typeinfo对象的name方法,即可以打印传入的类型对象的具体类型信息
cout<<"Now Object = "< delete employee[i];//动态释放相应内存
}
}

void ptrPrint(const Employee const *employee){//指向常量数据的常量指针
employee->print();
cout<<"\nearning = "<earning()<earning();
}

=================================================

程序执行的结果:

CommsionEmployee: bai, sunwu
socialNumber : 123456789 SalaryRate = 0.50, sailSalary = 10000.00
Earning = 5000.00
Old baseCommsionEmployee sala = 10000.00//此处动态的识别了BaseCommsionEmployee对象类型,动态强制类型转换,并修改了相应的信息。
After increame 10% ,Now baseCommsionEmployee baseSala = 11000.00
BaseSalary CommsionEmployee: bai, ruru
socialNumber : 987654321 SalaryRate = 0.50, sailSalary = 10000.00 BaseSalar
1000.00
Earning = 16000.00
WeekEmployee: bai, sun
socialNumber : 192837465 weekSalary = 4000.00
Earning = 4000.00
HourEmployee: bai, wu
socialNumber : 00000000 hours = 8.00 hourSalary = 100.00
Earning = 800.00
Now Object = class CommsionEmployeeis destrctor !!!//动态类型识别
Now Object = class BaseCommsionEmployeeis destrctor !!!
Now Object = class WeekEmployeeis destrctor !!!
Now Object = class HourlyEmployeeis destrctor !!!