本文參照於狄泰軟體學院,唐佐林老師的——《c++深度剖析教程》
我們在父子間的衝突發現,可以定義乙個虛函式來解決父類指標(引用)引發的同名覆蓋的問題。
在物件導向中還可能出現下面的情況:
1. 基類指標指向子類物件
2. 基類引用成為子類物件的別名
靜態型別:變數(物件)自身的型別
動態型別:指標(引用)所指向物件的實際型別
表示式的靜態型別在編譯時總是已知的,它是變數宣告時的型別或表示式生成的型別,動態型別則是變數或表示式表示的記憶體中的物件的型別。動態型別直到執行時才可知。
那麼我們是否可以將父類型別強制轉換為子類型別呢?強制轉換會成功嗎?
基類指標是否可以強制型別轉換為子類指標取決於動態型別!
那麼,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;
}int main(int argc, char *argv)
輸出結果:我們可以發現程式中的一些缺陷,0 i』m a derived.
0x6cff08
0
1. 強制型別轉換是不一定成功的。
2. 必須從基類開始提供型別轉換虛函式
3. 所有的派生類都必須重寫型別轉換函式
4. 每個派生類的型別名必須唯一
c++的解決方案:型別識別關鍵字
c++提供了typeid關鍵字用於獲取型別資訊
typeid關鍵字返回對應引數的型別資訊
typeif返回乙個type_info類物件
當typeid的引數為null時丟擲異常
當引數為型別時:返回靜態型別資訊
當引數為變數時:
不存在虛函式表則返回靜態型別資訊
存在虛函式表則返回動態型別資訊
示例**:typeid型別識別
#include
#include
#include
using
namespace
std;
class base
};class derived : public base
};void test(base* b)
int main(int argc, char *argv)
C 66 C 中的型別識別
靜態型別 變數 物件 自身的型別 動態型別 指標 引用 所指向物件的實際型別 基類指標是否可以強制型別轉換為子類指標 取決動態型別 void test base b 問題 c 中如何得到動態型別?方案1 dynamic cast 能夠判斷轉換是否成功,但是不能說明指標指向的具體型別 轉換不成功就返回...
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 靜態型別...