您好,登錄后才能下訂單哦!
dynamic_cast和static_cast是C++中的運行時類型轉(zhuǎn)換運算符,代碼如下:
class A { public: INT data; virtual void test() {}; }; class C { public: virtual void show() { } }; class B :public A { public: void test() { AfxMessageBox(_T("ok")); } }; //調(diào)用如下: void CtestThreadDlg::OnBnClickedButton14() { A *pA = new A ; pA->data = 21; C * pC = new C; B *pB = dynamic_cast<B*>(pC); INT c = pB->data; pB->test(); }
1、對于有繼承關(guān)系的兩個類:
(1)子類轉(zhuǎn)成父類dynamic_cast和static_cast都沒有問題.
(2)父類轉(zhuǎn)成子類,dynamic_cast要求父類中有虛函數(shù),否則編譯不通過。static_cast不作此要求,編譯通過。
在有虛函數(shù)的前提下,如果父類指針的確實指向的是子類實例,dynamic_cast轉(zhuǎn)換成功,否則返回NULL;
static_cast對于轉(zhuǎn)換前的指針是否指向?qū)嶋H子類實例,不作要求,都能轉(zhuǎn)換成功。
(3)在編譯通過成功,且返回指針不為空的前提下,兩者轉(zhuǎn)換結(jié)果指針,都可以用來讀寫父類和子類成員函數(shù)和變量。
(4)如果父類指針不是指向子類實例,編譯都能通過,但是dynamic_cast返回為NULL,不能操作對象;
static_cast返回非空指針,可以讀寫父類成員變量,也能調(diào)用其成員函數(shù)。子類的成員函數(shù)可以調(diào)用,但是當操作涉及子類成員變量時候,不成功。
2、對于沒有繼承關(guān)系的兩個類
static_cast可以編譯通過,dynamic_cast不能編譯通過。兩者都不能讀寫成員變量和函數(shù)。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。