1.dynamic_cast為什么要使用?
因為能夠 安全地 將基類指針或引用轉換為派生類的。
為何這樣說呢?
因為如果被綁定的指針不是目標類型的話說dynamic_cast會失敗,對於指針類型的轉換,最佳實踐是在條件中去執行,這樣可以保證轉換和結果測試在一個表達式中進行,從而不可能在測試轉換前不經意地使用派生類指針。
舉例:
if (Derived *pDerived = dynamic_cast<Derived *>pBase) //能夠轉換成功,說明pBase指向的是Derived類型的對象 { //使用pDerived指向的派生類對象 } else//pBase指向的是Base類型的對象 { //使用pBase指向的基類對象 }
2.什么時候可以使用dynamic_cast來代替虛函數?
3.dynamic_cast使用的場景:
如果你必須做一個非多態的工作在繼承類B和C上,但只能接收基類A,則需要如下的操作:
class A { public: virtual ~A(){} }; class B: public A { public: void work4B(){} }; class C: public A { public: void work4C(){} }; void non_polymorphic_work(A* ap) { if (B* bp =dynamic_cast<B*>(ap)) bp->work4B(); if (C* cp =dynamic_cast<C*>(ap)) cp->work4C(); }