[英]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
类不同, C
与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 :-(
如果没有dynamic_cast
,则无法访问getObjectType1()
,因为静态类型A不知道此函数。 我需要重新考虑我的设计。 有任何想法吗?
在正确设计的对象层次结构中,使用dynamic_cast
是一种罕见的事情。 当然,存在抛出多态树,但这并不意味着你必须使用它。
想想这个。 一般来说,为什么你需要使用dynamic_cast
? 因为您拥有的基准指针不能提供您需要的设施,对吧? 多态性有什么意义? 为类似操作提供不同的行为,在运行时选择行为,对吧?
那两个陈述有点矛盾吗? 如果您的对象的界面设计正确,那么当您调用时,您并不关心将采用什么样的行为->Foo()
- 您只想调用->Foo()
。
如果你需要经常使用dynamic_cast
,那么代码味道会告诉你接口有问题。 也许你试图在一个界面上推得太多?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.