程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++中運行時類型信息(RTTI)及動態強制類型轉換

C++中運行時類型信息(RTTI)及動態強制類型轉換

編輯:C++入門知識

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

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved