WEB开发网
开发学院软件开发C++ C++中运行时类型信息(RTTI)及动态强制类型转换 阅读

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

 2012-08-21 12:49:24 来源:WEB开发网   
核心提示: 采用通用方式(即多态形式)编程时,如果想在运行时修改相应的派生类对象的信息,C++中运行时类型信息(RTTI)及动态强制类型转换,我们可以使用C++中强大的运行时类型信息机制,来完成相应派生类对象状态的改变,然后通过这个指针变量//来调用只属于派生类对象的方法修改派生类对象的状态(即BaseCommsionEmplo

 采用通用方式(即多态形式)编程时,如果想在运行时修改相应的派生类对象的信息,我们可以使用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++){//多态的判断基类所指派生类对象的类型信息,并打印

1 2  下一页

Tags:中运 行时 类型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接