c++ - dynamic_cast 与 base 中的虚拟 AsDerived 方法

标签 c++ inheritance casting

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

相关文章:

c# - 如何检查一个值是否可以转换为泛型类型?

c++ - 类,BOOST_TEST_MODULE,BOOST_AUTO_TEST_SUITE : problems from naming?

c++ - 在运行时研究 C++ 软件中的类

c++ - 线程安全容器

java - 父类是否应该引用子类?

ios - 从 'Int?' 转换为无关类型 'NSNumber' 总是失败

c++ - NT 文件系统上非常小的文件上的 FSCTL_GET_RETRIEVAL_POINTERS 失败

c++ - 如何根据类访问特定的 protected 继承成员?

c++ - CStatic 自定义控件

c - 将 uint16_t 变量传递给期望 uint8_t 变量危险的函数