第66課 C 中的型別識別

2022-08-17 03:48:15 字數 3164 閱讀 3927

(1)在物件導向可能出現下面的情況

基類指標指向子類物件

基類引用成為子類物件別名

靜態型別——變數(物件)自身的型別(定義變數型別時型別或引數型別

動態型別——指標(引用)所指向的物件的實際型別

(2)基類指標轉子類指標:

①示例:derived* d =static_cast(pbase);//危險的轉換方式

②問題:不安全基類指標是否可以強制型別轉換子類指標

取決動態型別。

(1)解決方案

①在基類中定義虛函式,並返回具體的型別資訊

所有的派生類必須實現型別相關的虛函式

每個類中的型別虛函式需要不同的實現

【程式設計實驗】動態型別識別  66-1.cpp

#include #include 

using

namespace

std;

class

base

};class derived : public

base

void

print()

}; class child : public

base};

void test(base*b)

//如果類中沒有虛函式表,則呼叫dynamic_cast會直接報錯,編譯不過。

//當父、子類沒有繼承關係時,dynamic_cast返回false,否則會轉換後

//實際物件的位址

cout

<< dynamic_cast(b) <

intmain()

執行結果:

(2)多型解決方案缺陷

①必須從基類開始提供型別虛函式

所有的派生類必須重寫型別虛函式

每個派生類的型別名必須唯一

(1)typeid關鍵字

(2)typeid關鍵字的使用

int i = 0

;const type_info& tiv =typeid(i);//得到變數i的型別資訊

const type_info& tii =typeid(int);//得到int型別資訊

(3)typeid的注意事項當引數為型別時返回靜態型別資訊當引數為變數時

a.不存在虛函式表時:返回靜態型別資訊

b.存在虛函式表時:返回動態型別資訊

【程式設計實驗】typeid型別識別  66-2.cpp

#include #include 

#include

//for typeid

using

namespace

std;

class

base

}; class

derived: public

base};

void test(base*b)

intmain()

執行結果:g++下類名前面的數字表示類名的長度

(1)c++中有靜態型別動態型別概念

(2)利用多型能夠實現物件動態型別識別

(3)typeid是專用於型別識別的關鍵字

(4)typeid能夠返回物件的動態型別

資訊

66 c 中的型別識別

在物件導向中可能出現下面的情況 基類指標指向子類物件,基類引用成為子類物件的別名。base p new derived base r p 靜態型別 動態型別 靜態型別 變數 物件 自身的型別 動態型別 指標 引用 所指向物件的實際型別 void test base b b指向的型別不確定 危險的轉換...

66 C 中的型別識別

注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 9.2.0 一 型別識別 1 在物件導向中可能出現下面的情況 基類指標指向子類物件 基類引用成為了子類物件的別名 無法判斷p指向父類物件還是子類物件。p期望指向base 父類 2 靜態型別...

C 66 C 中的型別識別

靜態型別 變數 物件 自身的型別 動態型別 指標 引用 所指向物件的實際型別 基類指標是否可以強制型別轉換為子類指標 取決動態型別 void test base b 問題 c 中如何得到動態型別?方案1 dynamic cast 能夠判斷轉換是否成功,但是不能說明指標指向的具體型別 轉換不成功就返回...