使用dynamic_cast和多态的最佳实践

时间:2012-05-11 10:01:39

标签: c++ oop polymorphism downcast

我遇到了一个设计问题,我不确定如何以最佳方式处理。我希望我的代码能够成为未来的证明,但仍然不会变得混乱和复杂(极客的困境)。

目前我的设计有以下设置

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

班级B与班级A不同,班级D和班级E与班级B不同,C与班级{{0}不同1}}。

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

dynamic_cast

正如您所看到的,我将非常想要使用A* a1 = new class C; C* c1 = dynamics_cast<C*>(a1); if(c1){ //Success!!!} ... !我需要尝试找到一种很好的方法来做到这一点,而不是dynamic_cast语句额外的。{/ p>

有这样一种巧妙的方法吗?我似乎记得在Scott Meyers的书中看到了一些东西,但是我不在家,一两个星期都无法访问它。

非常感谢任何参考/示例。

如果需要,我可以将类if()放入一个接口,这将是一种解决方案

B

但不理想。

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

B* d1 = new D;
B* e1 = new E;
由于静态类型A不知道此函数,

无法访问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()。我需要重新考虑我的设计。有什么想法吗?

1 个答案:

答案 0 :(得分:11)

在设计合理的对象层次结构中,dynamic_cast的使用非常罕见。当然,它存在于铸造和一个多态树,但这并不意味着你必须使用它。

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

阿伦这两个陈述有些矛盾吗?如果您的对象界面设计正确,那么当您致电->Foo()时,您并不真正关心将采用何种行为 - 您只想致电->Foo()

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