2

C ++では、ポインターを1つの型として宣言し、代わりに別の継承型を指すことができます。あなたが現在指しているものを知る方法はありますか?

#include <typeinfo>
using namespace std;

class Foo
{
};

class Bar : public Foo
{
};

int main()
{
    Bar bar;
    Foo* foo = &bar;
    bool I_WANT_THIS_TO_BE_TRUE = (typeid(*foo) == typeid(Bar));
    return 0;
}
4

2 に答える 2

7

で仮想関数を宣言しなかったため、これは失敗しますFoo。たとえば、仮想デストラクタを使用するように変更すると、期待どおりの結果が得られます。

于 2012-12-30T13:33:44.807 に答える
2

あなたが探しているのはリフレクション、またはRTTI(実行時型情報)のものです。

件名を開始するための情報については、これを参照してください:C ++の属性およびリフレクションライブラリ?

当然のことながら、ウィキペディアにはRTTIに関する記事もあります:http://en.wikipedia.org/wiki/Run-time_type_information

次に、いくつかの共通基本クラス(すべてのサブクラスに継承されるリフレクションメソッドを提供する)から派生したオブジェクトにリフレクション機能を提供するフレームワークがあります。例として、Qtのメタオブジェクトシステムがあります。これらは、プレーンなC ++ RTTIよりもはるかに多くの情報を提供し、完全なリフレクションサポートを提供します(コンパイル時に不明な名前でメソッドを呼び出すなど、C ++メソッドを呼び出すjavascriptコードなど)。

于 2012-12-30T13:37:09.517 に答える