virtual void Foo()
が定義されている抽象的なインターフェイスI
が他の関数とともに定義されています。 Foo
が再定義されたサブクラスと、Foo
が再定義されていないサブクラスがあります。さて、I* pi
を与えて、Foo
が再定義されているかどうかを知ることはできますか?つまり、pi->Foo()
がI::Foo()
またはX::Foo()
を呼び出すかどうかを知りたいと思います。X
は、Foo
が再定義されたタイプです。これは、&I::Foo
と&pi->Foo
の間の関数ポインタを比較することで行うことができますが、正確な方法はわかりません。実行時に具体的なタイプのpi
がわからないので、関数ポインタを直接&I::Foo != &X::Foo
と比較することはできません。実行時にC++のチェック関数がオーバーロードされているかどうか
ADD: だから、多くの人が抽象概念と仮想関数の概念に反してデザインが悪いと指摘していました。私がこれをやっている主な理由は、速度を向上させるために空の関数呼び出しをバイパスすることです。 Foo()
のいくつかは空ですのでが空の場合はpi
のベクトルから削除したいと思います。
なぜですか?関数を呼び出すと、 'I :: foo'で終わるかどうかがわかります。それからあなたは知っているよ! –
好奇心で、なぜこれをやりたいのですか?私は悪いデザインのにおいがする。 –
私が知る限り、動的ディスパッチの結果を保存することはできません。私は[これについて質問があった](http://stackoverflow.com/questions/7451442/hoisting-the-dynamic-type-out-of-a-loop-aka-doing-java-the-c-way)atいくつかのポイント。 Objective-C++ではこれを行うことができます。 –