當試圖訪問派生類行爲時,我讀到的最常見方法是使用dynamic_cast
s,即dynamic_cast<DerivedA*>(BasePtr)->DerivedAOnlyMethod()
。這不太好,但每個人都明白髮生了什麼。dynamic_cast vs基於虛擬AsDerived方法
現在我正在此轉換由導出基類,對於每一個派生類的虛函數處理的代碼,即:
class Base
{
public:
virtual DerivedA* AsDerivedA() { throw Exception("Not an A"); }
virtual DerivedB* AsDerivedB() { throw Exception("Not a B"); }
// etc.
};
class DerivedA : public Base
{
public:
DerivedA* AsDerivedA() { return this; }
};
// etc.
使用是那麼BasePtr->AsDerivedA()->DerivedAOnlyMethod()
。 Imho,這使基類變得混亂,並暴露出它不應該需要的派生類的知識。
我太缺乏經驗,肯定地說哪個更好,所以我正在尋找爭論和反對任何構造。哪一種比較習慣?他們如何比較性能和安全性?
這些函數打破[open closed principle] [1]。如果您要添加C類,則需要更改基類以添加AsDerivedC。 [1]:https://en.wikipedia.org/wiki/Open/closed_principle – Davidbrcz