(这个问题可能应该参考 Stroustrup 来回答。)
能够请求指向最派生类的指针似乎非常有用,如下所示:
class Base { ... };
class DerivedA { ... };
class DerivedB { ... };
class Processor
{
public:
void Do(Base* b) {...}
void Do(DerivedA* d) {...}
void Do(DerivedB* d) {...}
};
list<Base*> things;
Processor p;
for(list<Base*>::iterator i=things.begin(), e=things.end(); i!=e; ++i)
{
p.Do(CAST_TO_MOST_DERIVED_CLASS(*i));
}
但是这种机制在 c++ 中没有提供。为什么?
更新,激励示例:
假设您没有 Base 和 Derived 以及 Processor,而是:
class Fruit
class Apple : public Fruit
class Orange: public Fruit
class Eater
{
void Eat(Fruit* f) { ... }
void Eat(Apple* f) { Wash(f); ... }
void Eat(Orange* f) { Peel(f); ... }
};
Eater me;
for each Fruit* f in Fruits
me.Eat(f);
但这在 C++ 中很难做到,需要像访问者模式这样的创造性解决方案。那么,问题是:为什么在 C++ 中这样做很棘手,而像“CAST_TO_MOST_DERIVED”这样的东西会让它变得更简单?
更新:维基百科无所不知
我认为 Pontus Gagge 有一个很好的答案。从关于Multiple Dispatch的 Wikipedia 条目中添加这一点:
“Stroustrup 提到他喜欢The Design and Evolution of C++中的 Multi-methods 概念,并考虑在 C++ 中实现它,但声称无法找到有效的示例实现(类似于虚函数)并解决一些可能的类型歧义问题. 他接着说,虽然这个特性仍然很好,但它可以使用双重调度或基于类型的查找表来近似实现,如上面的 C/C++ 示例中所述,因此对于未来的语言来说是一个低优先级特性修订。”
作为背景,您可以阅读有关Multi-Methods的一些摘要,这比我提到的那种调用要好,因为它们可以正常工作。