繁体   English   中英

使用dynamic_cast和多态的最佳实践

[英]Best practice with dynamic_cast and polymorphism

我有一个设计问题,我不知道如何以最好的方式处理。 我希望我的代码能够成为未来的证明,而且仍然不会变得混乱和复杂(极客的困境)。

目前我的设计有以下设置

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

B类与A类不同, D类和E类与B类不同, CA类不同。

由于这些类不同,我需要使用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 :-(

如果没有dynamic_cast ,则无法访问getObjectType1() ,因为静态类型A不知道此函数。 我需要重新考虑我的设计。 有任何想法吗?

在正确设计的对象层次结构中,使用dynamic_cast是一种罕见的事情。 当然,存在抛出多态树,但这并不意味着你必须使用它。

想想这个。 一般来说,为什么你需要使用dynamic_cast 因为您拥有的基准指针不能提供您需要的设施,对吧? 多态性有什么意义? 为类似操作提供不同的行为,在运行时选择行为,对吧?

那两个陈述有点矛盾吗? 如果您的对象的界面设计正确,那么当您调用时,您并不关心将采用什么样的行为->Foo() - 您只想调用->Foo()

如果你需要经常使用dynamic_cast ,那么代码味道会告诉你接口有问题。 也许你试图在一个界面上推得太多?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM