当试图访问派生类行为时,我读到的最常见方法是使用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