(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()
![](https://pic.w3help.cc/ef6/bcdc274ea3e26b2b5d6bdd1297bcd.jpeg)
①必須從基類開始提供型別虛函式
②所有的派生類都必須重寫型別虛函式
③每個派生類的型別名必須唯一
(1)typeid關鍵字
(2)typeid關鍵字的使用
int i = 0(3)typeid的注意事項①當引數為型別時:返回靜態型別資訊②當引數為變數時:;const type_info& tiv =typeid(i);//得到變數i的型別資訊
const type_info& tii =typeid(int);//得到int型別資訊
a.不存在虛函式表時:返回靜態型別資訊
b.存在虛函式表時:返回動態型別資訊
【程式設計實驗】typeid型別識別 66-2.cpp
#include #include執行結果:g++下類名前面的數字表示類名的長度#include
//for typeid
using
namespace
std;
class
base
}; class
derived: public
base};
void test(base*b)
intmain()
![](https://pic.w3help.cc/01f/878243f53c913450b1d975844598a.jpeg)
(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 能夠判斷轉換是否成功,但是不能說明指標指向的具體型別 轉換不成功就返回...