采用通用方式(即多態形式)編程時,如果想在運行時修改相應的派生類對象的信息,我們可以使用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 !!!