(この質問は、おそらく 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++ で行うのは難しく、ビジター パターンのような独創的なソリューションが必要です。問題は、「CAST_TO_MOST_DERIVED」のようなものを使用するとはるかに簡単になるのに、C++ でこれを行うのが難しいのはなぜですか?
更新: ウィキペディアはすべてを知っている
ポンタス・ガッジは良い答えを持っていると思います。ウィキペディアのMultiple Dispatchのエントリから、次のビットを追加します。
「Stroustrup は、The Design and Evolution of C++のマルチメソッドの概念が好きで、C++ での実装を検討したと述べていますが、(仮想関数に匹敵する) 効率的なサンプル実装を見つけることができず、型のあいまいさの問題を解決できなかったと主張しています。 . 彼は続けて、この機能はまだあればいいのですが、上記の C/C++ の例で概説したように、ダブル ディスパッチまたは型ベースのルックアップ テーブルを使用してほぼ実装できるため、将来の言語では優先度の低い機能であると述べています。リビジョン。」
背景については、 Multi-Methodsについての簡単な要約を読むことができます。これは、私が言及したような呼び出しよりも優れているでしょう。