動態類型轉換是比靜態類型轉換更爲嚴格的一種類型轉換。
如下代碼基本數據類型無法通過動態類型轉換
//基礎類型不可以轉換
char c = 'a';
//dynamic_cast非常嚴格,失去精度 或者不安全都不可以轉換
double d = dynamic_cast<double>(c);
動態數據類型轉換隻能發生在父類和子類之間,現在就通過代碼來測試下
class Base2
{
void func(){};
};
class Child2 :public Base2
{
virtual void func(){};
};
父類和子類進行轉換
Base2 * base = NULL;
Child2 * child = NULL;
//child轉Base2 * 安全
Base2 * base2 = dynamic_cast<Base2*>(child);
子類和父類進行轉換
Base2 * base = NULL;
Child2 * child = NULL;
//base 轉Child2 * 不安全
Child2 * child2 = dynamic_cast<Child2*>(base);
很遺憾,以上代碼在進行編譯的時候會報錯,無法進行轉換。如果非要子類轉爲父類類型,那麼就要求子類和父類要發生多態。
父類和子類發生多態,要求2點。
第1:父類中要有虛函數
第2:子類重寫父類對應的虛函數,將子類的引用放到父類類型變量中。
明白了這點之後,我們將Base2中的func()變爲虛函數,代碼如下
class Base2
{
virtual void func(){};
};
子類重寫func()代碼如下
class Child2 :public Base2
{
virtual void func(){};
};
將子類的引用放到父類類型變量中
Base2 * base3 = new Child2;
現在就可以用動態類型轉換將父類類型轉爲子類類型,代碼如下
Child2 * child3 = dynamic_cast<Child2*>(base3);