執行時型別資訊

2021-08-05 22:05:19 字數 1656 閱讀 3553

一.向下造型

•動態型別轉換(dynamic_cast)用於將基類型別的指標或引用轉換為其子類型別的指標或引用,前提是子類必須從基類多型繼承,即基類包含至少乙個虛函式

–class a 

;–class b : public a ;

–b b;

a* pa = &b;

b* pb = dynamic_cast

(pa);

a& ra = b;

b& rb = dynamic_cast

(ra);

二.型別檢查

•動態型別轉換會對所需轉換的基類指標或引用做檢查,如果其目標確實為期望得到的子類型別的物件,則轉換成功,否則轉換失敗

–不是對指標或引用做型別轉換,編譯錯誤

–轉換目標和源不具多型繼承性,編譯錯誤

–轉換源的目標物件非目標型別,執行錯誤

三.轉換失敗

•針對指標的動態型別轉換,以返回空指標(null)表示失敗,針對引用的動態型別轉換,以丟擲bad_cast異常表示失敗

–a* pa = ...; 

b* pb = dynamic_cast

(pa);

if (pb == null)

cout

<< "轉換失敗!"

<< endl;

–a& ra = ...;

try

catch (bad_cast& ex)

一.typeinfo物件

•typeid操作符既可用於型別也可用於物件

–int x;

typeid (int);

typeid (x);

•typeid操作符返回typeinfo物件的常引用

–#include 

–typeinfo類的成員函式name(),返回空字元結尾的型別名

cout

<< typeid ( char (*(*[5]) (short (*) (int, long))) (float, double) ).name () << endl;

// a5_pfpfcfdepfsilee

–typeinfo類支援「==」和「!=」操作符,可直接用於型別相同與否的判斷

if (typeid (*human) == typeid (student))

二.動態與靜態型別資訊

•當typeid作用於基類型別的指標或引用的目標時,若基類包含至少乙個虛函式,即存在多型繼承,

該操作符所返回的型別資訊將由該指標或引用的實際目標物件的型別決定,否則由該指標或引用本身的型別決定

–class a {}; 

class b : public a

}; // 繼承

class c : public b {}; // 多型繼承

–c c;

a& a = c;

cout

<< typeid (a).name () << endl; // 1a - 靜態型別

b& b = c;

cout

<< typeid (b).name () << endl; // 1c - 動態型別

執行時型別資訊RTTI

我們在寫c 的時候經常碰到使用dynamic cast進行型別轉換的情況,也都知道經過dynamic cast的轉換更加安全,因為dynamic cast進行了型別檢查。但是可能很多人不知道dynamic cast是c 執行時型別資訊 rtti 機制鏈條上的乙個節點。rtti提供了兩個操作符和乙個類...

MFC執行時型別資訊相關類

some guys seem to be unsatisfied to use mfc,they prefer to use pure win32 c but in some domains,mfc or similar framework will be a necessary option.th...

執行時型別識別

執行時的型別識別 rtti 分為兩類 1.typeid操作符 2.dynamic cast操作符 先看第二種 dynamic cast完成將基類型別的指標或者引用安全轉化為派生類型別的指標和引用。對於指標,如果轉化失敗,則將指標置為null,對於引用型別,因為沒有null,所以直接丟擲bad cas...