C++中提供了兩種類型轉換的方法: static_cast和dynamic_cast
簡單從名字看一個是靜態轉換, 另一個是動態轉換
一般轉換分為兩種: 上行轉換和下行轉換
上行轉換大致意思是把子類實例向上轉換為父類型, 下行轉換是把父類實例轉換為子類實例
通常子類因為繼承關系會包含父類的所有屬性, 但是有些子類的屬性父類沒有
所以上行轉換的時候,子類實例轉換給父類是安全的, 轉換后的指針或者對象可以放心使用父類的所有方法或者屬性
但是下行轉換的時候可能是不安全的, 因為假如子類有父類沒有的屬性或者方法的話, 父類指針或者實例轉換為子類型后
轉換后的實例中並沒有子類多出來的方法或屬性, 當調用到這些方法或屬性時程序就會崩潰了
舉個栗子:
#include <iostream> using namespace std; class Base{ int a; public: void baseMethod(){ cout << "Base method" << endl; }; }; class ChildClass: public Base{ int b; public: void childMethod(){ cout << "child method" << endl; }; }; int main(){ /* 上行轉換 */ ChildClass child; Base b = static_cast<Base>(child); b.baseMethod(); /* 下行轉換 */ Base bb; ChildClass cc = static_cast<ChildClass>(bb); }
有的編譯器會校驗下行轉換, 會提示錯誤