dynamic_cast和多态性的最佳实践

Best practice with dynamic_cast and polymorphism

本文关键字:最佳 多态性 cast dynamic      更新时间:2023-10-16

我有一个设计问题,我不确定如何以最佳方式处理。我希望我的代码是面向未来的,并且仍然不是混乱和复杂的(极客的困境(。

目前我的设计有以下设置

derived class D          derived class E
  ^                          ^
  |                          |
derived abstract class B  ->              derived class C
  ^                                            ^ 
  |                                            |
              Abstract Base class A

B不同于类A,类D和类E不同于类BC类不同于类A

由于这些类不同,我需要使用 dynamic_cast 运算符。

A* a1 = new class C;
C* c1 = dynamics_cast<C*>(a1);
if(c1){ //Success!!!}
...

如您所见,我会想经常使用dynamic_cast!我需要尝试找到一种很好的方法来做到这一点,而不是充满额外的if()陈述。

有没有一种巧妙的方法可以做到这一点?我似乎记得在斯科特·迈耶斯(Scott Meyers(的书中看到过一些东西,但我不在家,一两个星期都无法访问它。

任何参考/示例将不胜感激。

此外,如果需要,我可以将类B变成一个接口,这将是一种解决方案

B* d1 = new D;
B* e1 = new E;

但不理想。

注意:我添加了此示例以显示我当前的设计失败

class A {...};
class B: public A {
   public:
      virtual std::vector<objectType1*>& getObjectType1();
};
class C: public B {
   private:
     void newFunction();
};
A* c1 = new C();
std::vector<objectType1*> example = c1->getObjectType1(); // Wrong; need dyanmic_cast :-(

无法访问getObjectType1()没有dynamic_cast因为静态类型 A 不知道这个函数。我需要重新考虑我的设计。有什么想法吗?

在正确设计的对象层次结构中,使用 dynamic_cast 是相当罕见的。 当然,它的存在是为了上下投射多态树,但这并不意味着你必须使用它。

一想。 一般来说,为什么需要使用dynamic_cast? 因为您拥有的基本指针无法提供您需要的设施,对吧? 多态性的意义何在? 为类似的操作提供不同的行为,其中行为是在运行时选择的,对吗?

这两种说法是不是有些矛盾? 如果你对象的接口设计正确,那么你并不关心当你调用->Foo()时将采用什么样的行为——你只想调用->Foo()

如果您需要经常使用dynamic_cast,这是一种代码异味,告诉您接口有问题。 也许您试图在一个界面中塞入太多内容?