66 C 中的型別識別

2021-10-09 13:00:34 字數 2998 閱讀 2692

注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。

測試環境:ubuntu 10.10

gcc版本:9.2.0

一、型別識別

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

-    基類指標指向子類物件

-    基類引用成為了子類物件的別名

無法判斷p指向父類物件還是子類物件。p期望指向base*(父類)

2) 靜態型別—變數(物件)自身的型別(寫**時就能確定型別)

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

問題c++中如何得到動態型別?

二、動態型別識別

1) 解決方案—利用多型

1、在基類中定義虛函式返回具體的型別資訊

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

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

程式設計實驗

動態型別識別

66-1.cpp

#include #include using namespace std;

class base

};class derived : public base

void printf()

};class child : public base

};void test(base* b)

int main(int argc, char *ar**)

操作:

1) g++ 66-1.cpp -o 66-1.out編譯正確

分析:雖然編譯正確,但是test()中derived* d = static_cast(b);的b是父類要轉換成指定子類。

2) 解決上述問題辦法:

void test(base* b)

}

g++  66-1.cpp -o 66-1.out編譯正確,列印結果:

i'm a derived.
分析:

用staic_cast進行轉換不好,這裡有繼承關係,而且還有虛函式用dynamic_cast<>轉換更好。

void test(base* b)

cout << dynamic_cast(b) << endl; //測試一(我們需的不只是轉換成功,還需要具體型別)

}

g++  66-1.cpp -o 66-1.out編譯正確,列印結果:

0(dynamic_cast轉換失敗)

i'm a derived.

0xbfc57248 //dynamic_cast轉換成功

0(dynamic_cast轉換失敗)

2) 多型解決方案的缺陷

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

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

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

三、型別識別關鍵字

1) c++提供了typeid關鍵字用於獲取型別資訊

-    typeid關鍵字返回對應引數的型別資訊

-    typeid返回乙個type_info類物件

-    當typeid的引數為null時將丟擲異常

2) typeid關鍵字的使用

int i = 0;

const type_info& tiv = typeid(i);

const type_info& tii = typeid(int);

cout << (tiv == tii) << endl;

結論:相等

四、動態型別識別

1) typeid的注意事項

-    當引數為型別時:返回靜態型別資訊

-    當引數為變數時:

*不存在虛函式表-返回靜態型別資訊

*存在虛函式表-返回動態型別資訊

程式設計實驗

typeid型別識別

66-2.cpp

#include #include #include using namespace std;

class base

*/};class derived : public base

};void test(base* b)

int main(int argc, char *ar**)

操作:

1) g++ 66-2.cpp -o 66-2.out編譯正確,列印結果:

1

4base

4base

分析:

父類退化為子類,導致都列印4base。

解決辦法在父類base中定義虛函式:

#include #include #include using namespace std;

class base

};class derived : public base

};void test(base* b)

int main(int argc, char *ar**)

g++ 66-2.cpp -o 66-2.out編譯正確,列印結果:

1

4base

7derived

分析:

增加virtual,這裡防止子類退化為父類,能夠正常識別指標型別。

小結1) c++中有靜態型別和動態型別的概念

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

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

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

66 c 中的型別識別

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

C 66 C 中的型別識別

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

第66課 C 中的型別識別

1 在物件導向中可能出現下面的情況 基類指標指向子類物件 基類引用成為子類物件的別名 靜態型別 變數 物件 自身的型別 定義變數型別時型別或引數型別 動態型別 指標 引用 所指向的物件的實際型別 2 基類指標轉子類指標 示例 derived d static cast pbase 危險的轉換方式 問...