采用通用方式(即多态形式)编程时,如果想在运行时修改相应的派生类对象的信息,我们可以使用C++中强大的运行时类型信息机制,来完成相应派生类对象状态的改变。下面我们就来动态的改变BaseCommsionEmployee对象的状态,把它的基本工资在程序运行当中动态的增加10%。及动态的打印基类Employee指针所指派生类对象的的类型信息。
例:代码举例
#include
#include
#include
#include
#include
#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(){ //此格式具有极强传递性,对下面的所有数值的输出都起作用 //下面的语句动态的判断基类指针指向的派生类对象是不是相应的BaseCommsionEmployee类型, //如果是,则把基类指针强制向下转换成派生类指针并赋值给basePtr指针变量,然后通过这个指针变量 //来调用只属于派生类对象的方法修改派生类对象的状态(即BaseCommsionEmployee对象相应基本工资增加10% //如果基类指针所指不是BaseCommsionEmployee对象,则basePtr赋值为0 for(size_t i = 0; i < 4; i++){//多态的判断基类所指派生类对象的类型信息,并打印 //typeid函数定义在typeinfo头文件中,typeid()接收一个类型对象,此函数返回一个typeinfo对象,调用typeinfo对象的name方法,即可以打印传入的类型对象的具体类型信息 void ptrPrint(const Employee const *employee){//指向常量数据的常量指针 ================================================= 程序执行的结果: CommsionEmployee: bai, sunwu
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 = dynamic_cast
if(basePtr != 0){//判断是否是BaseCommsionEmployee对象
cout<<"Old baseCommsionEmployee sala = "<
cout<<"After increame 10% ,Now baseCommsionEmployee baseSala = "<
employee[j]->print();//多态的打印基类指针所指的派生类对象的方法,注意此方法必定是visual方法
cout<<"\nEarning = "<
cout<<"Now Object = "<
}
}
employee->print();
cout<<"\nearning = "<
}
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 !!!