4

簡単なC++の質問:ポインタの実行時型に基づいて関数または別の関数を呼び出すことは可能ですか?

たとえば、クラスAがあり、クラスBはAの子です。

次のような関数fを書きたい

f(A* a)
{//do something
}
f(B* b)
{//do something else
}

//call f()
A* a = new A();
A* b = new B();
f(a);//do something
f(b);//do something, but I'd like it to "do something else"

追加の精度:AとBはコードから定義およびインスタンス化されているため、AとBの仮想関数で通常のポリモーフィズムを使用することはできません...

RTTIを使用できることは知っていますが、より洗練されたソリューションはありますか?

4

4 に答える 4

5

これらの制約 (クラスを変更することはできません) があり、RTTI を使用しないと、いいえ。

デコレータのパターン、ラップA、およびB他のいくつかのクラスを使用しfて、それらをパラメータとして取得することもできますが、それはやり過ぎのようです。

于 2012-08-21T12:34:06.547 に答える
5

次を使用してそれを達成できますdynamic_cast

f(A* a)
{
B* b = dynamic_cast<B*>(a);
if (b == nullptr)
//do something
else
//do something else
}
于 2012-08-21T12:39:02.570 に答える
1

それはポリモーフィズムとは何の関係もありません。f(A*)同じ関数でf(B*)はなく、たまたま同じ識別子を持っているだけです。コンパイラは、使用するものを選択します。ある種の RTTI がなければ、C++ でこれを行うことはできません。

于 2012-08-21T12:36:56.547 に答える
0

あなたの質問を正しく理解できれば、あなたはmultimethodsを探しています。Bjarne Stroustrup によって書かれた実験的な拡張機能がありますが、C++ は言語機能としてマルチメソッドを提供しません。回避策として Visitor パターンを使用できます。C++ のマルチメソッドに関する非常に詳細な記事: C++ のマルチメソッド: 完全なソリューションの検索

于 2012-08-21T12:51:10.653 に答える