当尝试访问派生类行为时,我读到的最常见的方法是使用 dynamic_cast
s,即 dynamic_cast<DerivedA*>(BasePtr)->DerivedAOnlyMethod()
.这不是很漂亮,但每个人都明白发生了什么。
现在我正在编写一个代码,其中对于每个派生类,此转换由导出到基类的虚函数处理,即:
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()
.恕我直言,这会使基类变得困惑,并暴露了它不应该需要的有关派生类的知识。
我太缺乏经验无法肯定地说哪个更好,所以我正在寻找支持和反对这两种构造的论据。哪个更地道?他们如何比较性能和安全性?
最佳答案
好吧,将 AsDerived@
方法放入基类中肯定会导致更快的转换。
如果您使用 final
限制继承层次结构,那么该优势可能会减少或消除。
此外,您认为它不常见是正确的,因为它会带来困惑,并且会将所有相关派生类的知识引入基类。
总而言之,它可能有时在遇到瓶颈时很有用,但您会为此付出代价。
关于c++ - dynamic_cast 与 base 中的虚拟 AsDerived 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39095866/