先看代碼:ios
#include <iostream> using namespace std; class A { public: A() { cout << "A" << endl; } virtual ~A() { cout << "~A" << endl; } virtual void print() { cout << "A::Print()" << endl; } }; class B : public A { public: B(int i) : index(i) { cout << "B" << endl; } virtual ~B() { cout << "~B" << endl; } virtual void print() { cout << "B::Print(),index=" << index << endl; } int index; }; int main(int argc, char *argv[]) { A* pA = new A(); B* pB = new B(1); A* pAB = new B(5); B* pBA = static_cast<B*>(pA); B* pBB = static_cast<B*>(pB); B* pBAB = static_cast<B*>(pAB); if (pBA) { pBA->print(); } if (pBB) { pBB->print(); } if (pBAB) { pBAB->print(); } delete pA; delete pB; return 0; }
執行結果:函數
A A B A B A::Print() B::Print(),index=1 B::Print(),index=5 ~A ~B ~A
pBB和pBAB沒有任何問題,其自己就是B對象。pBA是從基類轉換爲B對象,可是調用的倒是A::Print(),由於pA對象並無構建B對象的內存,構建的僅是基類的內存,所以輸出基類的print()。spa
如今改動代碼,將A中的print函數去掉:指針
class A { public: A() { cout << "A" << endl; } virtual ~A() { cout << "~A" << endl; } /* virtual void print() { cout << "A::Print()" << endl; } */ };
程序在A::print()處崩潰!由於基類已經沒有print()函數了。這裏的pBA類型轉換是由基類構造的對象變爲派生類的指針,隱藏一個嚴重的程序BUG,可是編譯器並無在這裏給與任何提示,還轉換成功,獲得了相應的B對象指針。調試
接下來使用dynamic_cast進行類型轉換:code
B* pBA = dynamic_cast<B*>(pA); B* pBB = dynamic_cast<B*>(pB); B* pBAB = dynamic_cast<B*>(pAB);
程序調試結果,pBA轉換後爲0,並無轉換成功,就能夠在這裏對轉換對象進行判斷。對象
所以在使用基本類型進行轉換時,用static_cast,在涉及到對象之間的轉換時用dynamic_cast。內存
float val = 10.00f;編譯器
int iVal = static_cast<int>(val);io
A* pA = new B();
B* pB = dynamic_cast<B*>(pA);
if (pB != nullptr) {
pB->dosomething();
}