66 c 中的型別識別

2021-08-19 22:06:50 字數 1748 閱讀 2727

在物件導向中可能出現下面的情況:基類指標指向子類物件,基類引用成為子類物件的別名。

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 危險的轉換方式 問...