注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。
測試環境: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 危險的轉換方式 問...