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
,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 :-(
无法访问getObjectType1()
没有dynamic_cast
因为静态类型 A 不知道这个函数。我需要重新考虑我的设计。有什么想法吗?
在正确设计的对象层次结构中,使用 dynamic_cast
是相当罕见的。 当然,它的存在是为了上下投射多态树,但这并不意味着你必须使用它。
一想。 一般来说,为什么需要使用dynamic_cast
? 因为您拥有的基本指针无法提供您需要的设施,对吧? 多态性的意义何在? 为类似的操作提供不同的行为,其中行为是在运行时选择的,对吗?
这两种说法是不是有些矛盾? 如果你对象的接口设计正确,那么你并不关心当你调用->Foo()
时将采用什么样的行为——你只想调用->Foo()
。
如果您需要经常使用dynamic_cast
,这是一种代码异味,告诉您接口有问题。 也许您试图在一个界面中塞入太多内容?
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- 实现后期多态性的最佳方法
- 相互关联的C 类中多态性的最佳实践
- dynamic_cast和多态性的最佳实践