什么是动态铸造的一些“很好用”的例子?

我们经常听到/读到应该避免动态投射。 根据你的看法,我想知道什么是“好用”的例子?

编辑:

是的,我知道另一个线程:当我读到我问的第一个答案时,确实是这样。


最近的这个线索给出了一个它派生出来的例子。 有一个基本的Shape类和从它派生的类Circle和Rectangle。 在测试平等时,很显然Circle不能等于Rectangle,试图比较它们将是一场灾难。 在遍历指向Shapes的指针集合时,dynamic_cast会执行双重任务,告诉您这些形状是否可比,并为您提供适当的对象以进行比较。

向量迭代器不可取消


这是我经常做的事情,虽然不太好,但它很简单而且有用。

我经常使用实现接口的模板容器,想象一下

template<class T>
class MyVector : public ContainerInterface
...

ContainerInterface具有基本的有用内容,但仅此而已。 如果我想在不暴露我的模板实现的情况下对整数向量进行特定算法,那么在实现中接受接口对象并将其dynamic_cast接受到MyVector是非常有用的。 例:

// function prototype (public API, in the header file)
void ProcessVector( ContainerInterface& vecIfce );

// function implementation (private, in the .cpp file)
void ProcessVector( ContainerInterface& vecIfce)
{
    MyVector<int>& vecInt = dynamic_cast<MyVector<int> >(vecIfce); 
    // the cast throws bad_cast in case of error but you could use a
    // more complex method to choose which low-level implementation
    // to use, basically rolling by hand your own polymorphism.

    // Process a vector of integers
    ...
}

我可以将一个Process()方法添加到ContainerInterface中,该方法将被多态地解析,这将是一个更好的OOP方法,但我有时更喜欢这样做。 当你有简单的容器,很多算法,并且你想隐藏你的实现时,dynamic_cast提供了一个简单和丑陋的解决方案。

你也可以看看双重派遣技巧。

HTH


我目前的玩具项目使用dynamic_cast两次; 曾经为解决缺乏C ++中的多次调度(这是一个访问者风格的系统,可以使用多个调度来代替dynamic_casts),并且一次用于特殊情况下特定的子类型。

在我看来,这两个都是可以接受的,尽管前者至少源于语言赤字。 事实上,我认为这可能是一种常见的情况; 大多数dynamic_casts(以及大量的“设计模式”)是针对特定语言缺陷的解决方法,而不是针对某些特定语言缺陷的解决方案。

链接地址: http://www.djcxy.com/p/28437.html

上一篇: What are some 'good use' examples of dynamic casting?

下一篇: why malloc doesnot work in my c program?