我遇到了一个设计问题,我不确定如何以最佳方式处理。我希望我的代码能够成为未来的证明,但仍然不会变得混乱和复杂(极客的困境)。
目前我的设计有以下设置
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()
。我需要重新考虑我的设计。有什么想法吗?
答案 0 :(得分:11)
在设计合理的对象层次结构中,dynamic_cast
的使用非常罕见。当然,它存在于铸造和一个多态树,但这并不意味着你必须使用它。
想一想。一般来说,为什么需要使用dynamic_cast
?因为您所拥有的基准指针并不能提供您所需的设施,对吧?多态性有什么意义?为类似操作提供不同的行为,在运行时选择行为,对吗?
->Foo()
时,您并不真正关心将采用何种行为 - 您只想致电->Foo()
。
如果您需要经常使用dynamic_cast
,那么代码味道会告诉您接口出现问题。也许你正试图在一个界面上推得太多?