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...