類的繼承 C 中的型別識別

2021-08-20 09:26:57 字數 1797 閱讀 5772

本文參照於狄泰軟體學院,唐佐林老師的——《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 靜態型別...