c 型別轉換之dynamic cast

2021-06-19 16:08:36 字數 954 閱讀 7908

dynamic_cast僅用於物件的指標和引用,它確保型別轉換記過是乙個完全合法的請求類物件。

因此,dynamic_cast在轉換乙個類到乙個其基類的時候,總是成功:

class cbase;  

class cderived:public cbase;

cbase b; cbase* pb;

cderived d; cderived* pd;

pb = dynamic_cast(&d); // ok:derived-to-base

pd = dynamic_cast(&b); // wrong:base-to-derived

在此程式片段中的第二個轉換會產生乙個編譯錯誤,因為在dynamic_cast中基類到繼承類轉換是不允許的,除非基類是多型的。

那下面例子只要在基類中新增乙個虛函式,基類就支援多型了:

class cbase;};

class cderived:public cbase

;int main()

這樣,pd = dynamic_cast(b);從基類轉換到繼承類就能成功。這就是c++多型的魅力所在(更詳細的理解,請參考侯捷老師翻譯的《深度探索c++物件模型》,你會在裡面找到所有的答案)!

再看乙個多繼承的例子:

class animal   ;   int m1; };

class creature ; int m2; };

class bird:public animal, public creature ;

int main()

上面**case1 轉換和單繼承的一樣,case 2 則由於 case 1的作用,可以轉換了,case 3就弄不明白了,高手請指點,還是繼續看《深度探索c++物件模型》。

mysql型別轉換c 型別轉換 C 型別轉換

一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...

C 之轉換與類型別

轉換的作用 轉換可以使類型別物件支援混合型別的表示式 通過過載操作符,可能需要幾十個過載函式 如 類型別物件與int 的算術運算等 可以用乙個實參呼叫的非explicit建構函式定義了乙個隱式轉換,當提供了實參型別的物件而需要乙個類型別物件時,編譯器將使用該轉換。這種建構函式定義了實參型別到類型別的...

C 之資料型別轉換

支援除字串之外的其他資料型別轉換為字元陣列型別 include using namespace std intmain 函式名 功能str 初始化和列印流中內容 clear 清空流 include include include using namespace std intmain 函式名 功能s...