C 之動態型別識別

2021-10-03 11:53:35 字數 1251 閱讀 6288

小結問題:下面的程式有問題嗎?

class parent

};class child: public parent;

void test(parent* p)

由於基類指標可以直接指向派生類物件(c++賦值相容性原則),因此可能存在指標所指型別與具體指向的物件型別不同的情況

動態型別指的是基類指標所指向的物件的實際型別

void test(parent* p)
基類指標是否可以強制型別轉換為子類指標取決於動態型別!

c++中如何得到動態型別?

c++中的多型根據實際的物件型別呼叫對應的虛函式

可以在基類中定義虛函式返回具體的型別資訊

所有的派生類都必須實現型別相關的虛函式

每個類中的型別虛函式都需要不同的實現

class parent;

virtual int type()

};class child : public parent;

int type()

int add(int a, int b)

};void test(parent* p);

virtual int type()

};class child : public parent

;

int type()

int add(int a, int b)

};void test(parent* p)

};class child : public parent

};void test(parent* p)

};class child : public parent

};class newchild : public parent

;void test(parent* p)

};class child : public parent

};class newchild : public parent

;void test(parent* p)

{ if( typeid(*p) == typeid(child) ) //具體使用方式 child

{child* c = dynamic_cast(p);

cout<<"dynamic type: "<<"child"c++中可以通過多型的方式進行動態型別識別

dynamic_cast關鍵字是可用於動態型別識別

typeid關鍵字在c++中專用於動態型別的識別

C 3種動態型別識別的方法

基類指標所指物件的實際型別 必須從基類開始提供型別虛函式 所有的派生類都必須重寫型別虛函式 每個派生類的型別id必須唯一 dynamic cast這個關鍵字如果要轉換的實際型別和指定的型別不一樣,則會返回null。例如當指定型別為子類物件時,如果父類指標的動態型別是這個子類物件時,沒有錯誤,而動態型...

python之動態人臉識別

執行準備 所需檔案 haarcascade frontalface default.xml 獲取方式 1.開啟cmd,輸入指令 pip install i cv2 2.在安裝python的目錄下面,依次開啟資料夾 lib site packages cv2 data 所需檔案就在裡面了 實現效果 開...

c 型別識別及轉換

1.概念 rtti run time type information 即執行時型別識別,c 通過rtti實現對多型的支援。c 是靜態型別語言,其資料型別是在編譯期就確定的,不能在執行時更改。為了支援rtti,c 提供了乙個type info類和兩個關鍵字typeid和dynamic cast。ty...