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

8月 21st, 2012
Visited 4716 times, 1 so far today
 
0

Comments

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

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

void ptrPrint(const Employee const *employee){//指向常量数据的常量指针
    employee->print();
 cout<<“\nearning = “<<employee->earning()<<endl;//静态调用所有方法employee->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 !!!

Tags: