在物件導向中可能出現下面的情況:基類指標指向子類物件,基類引用成為子類物件的別名。
base* p=new derived();
base& r=*p;
靜態型別<->動態型別
靜態型別--變數(物件)自身的型別
動態型別--指標(引用)所指向物件的實際型別
void test(base* b) //b指向的型別不確定
//危險的轉換方式,b指向子類沒有問題,將b轉換為子類指標。b(父類指標)指向父類的話是不能轉換的,成為bug
derived* d=static_case(b);
基類指標是否可以強制型別轉換為子類指標取決於動態型別。
c++中如何得到動態型別?
解決方案:利用多型
1,在基類中定義虛函式返回具體的型別資訊。
2,所有的派生類都必須實現型別相關的虛函式。
3,每個類中的型別虛函式都需要不同的實現。
#include
#include
using namespace std;
class base
class derived : public base
void printf()
class child : public base
void test(base* b)
// cout << dynamic_cast(b) << endl; // test(&b);轉換不成功列印0,有虛函式用dynamic_cast,
int main(int argc, char *argv)
dynamic_cast將指向子類物件的父類指標轉換為指向子類物件的子類指標。
多型解決方案的缺陷:
必須從基類開始提供型別虛函式,所有的派生類都必須重寫型別虛函式,每個派生類的型別名必須唯一。從長期維護不太好。
解決方案2:
c++提供了typeid關鍵字用於獲取型別資訊,typeid關鍵字返回對應引數的型別資訊,typeid返回乙個type_info類物件,當typeid 的引數為null時將丟擲異常。使用:
int i=0;
const type_info& tiv=typeid(i);//type_info儲存i的型別資訊
const type_info& tii=typeid(int);
cout<<(tiv==tii)《注意事項:
當引數為型別時:返回靜態型別資訊。
當引數為變數時:不存在虛函式表-返回靜態型別資訊。
存在虛函式表:返回動態型別資訊。
#include
#include
#include
using namespace std;
class base
};class derived : public base
};void test(base* b)
int main(int argc, char *argv)
如果沒有虛函式(此例為析構函式),b指標指向的物件沒有虛函式表,返回靜態型別資訊,也就是說從b指標自身型別來判斷b期望的型別是什麼,但是卻是不同物件呼叫的。列印結果一樣4base。有虛函式,返回動態型別資訊,列印結果不同4base,7derived(不同編譯器結果不同,vs沒有數字)。
c++中有靜態型別和動態型別的概念,靜態型別是變數自身的型別,動態型別是指標所指向的實際型別,實際型別在編譯階段無法確定所以叫動態型別,利用多型能夠實現物件的動態型別識別,但是維護成本高,typeid是專用於型別識別的關鍵字,typeid能夠返回物件的動態型別資訊。
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 能夠判斷轉換是否成功,但是不能說明指標指向的具體型別 轉換不成功就返回...
第66課 C 中的型別識別
1 在物件導向中可能出現下面的情況 基類指標指向子類物件 基類引用成為子類物件的別名 靜態型別 變數 物件 自身的型別 定義變數型別時型別或引數型別 動態型別 指標 引用 所指向的物件的實際型別 2 基類指標轉子類指標 示例 derived d static cast pbase 危險的轉換方式 問...