8

typeid 関数を正しく取得できません。何か足りない?

コード:

class A
{
     public:
     int a1;
     A()
    {
    }
};


class B: public A
{
    public:
    int b1;
    B()
    {
    }
};


int main()
{
     B tempb;
     A tempa;
     A * ptempa;
     ptempa = &tempb;

     std::cout << typeid(tempb).name() << std::endl;
     std::cout << typeid(tempa).name() << std::endl;
     std::cout << typeid(*ptempa).name() << std::endl;

     return 0;
}

常に出力されます:

B級 A級 A級

プロジェクトにVS2010を使用しています

4

3 に答える 3

20

問題は、A仮想関数がないため、ポリモーフィック型として扱われないことです。その結果、typeidポインターが指すオブジェクトの実際の型ではなく、ポインターの宣言された型を検索します。

于 2013-08-09T13:36:36.483 に答える
10

これが期待どおりに機能するためには、それが指すオブジェクトが多態的である必要があります。たとえば、仮想デストラクタを追加するなど、コードよりAvirtualメソッドが期待どおりに機能する場合、gcc を使用してここでライブデモを行います

C++ ドラフト標準セクションからの引用5.2.8 型識別パラグラフ2は次のように述べています。

型が多相クラス型 (10.3) である glvalue 式に typeid が適用されると、結果は、最も派生したオブジェクト (1.8) の型を表す std::type_info オブジェクトを参照します [...]

これは、メソッドがある場合に適用さvirtualれます。あなたの場合、多相型がないため、段落3が適用されます。

typeid が多相クラス型の glvalue 以外の式に適用されると、結果は式の静的型を表す std::type_info オブジェクトを参照します。

したがって、static型が返されますA

もう少し完全なセクションにするために、10.3 仮想関数は次のように述べています。

仮想関数は、動的バインディングとオブジェクト指向プログラミングをサポートします。仮想関数を宣言または継承するクラスは、ポリモーフィック クラスと呼ばれます。

于 2013-08-09T15:00:52.530 に答える
0

芝刈りをしながら考えてみると… ポインターは、自分が指している物体の種類を知ることができません。型情報はポインタと共に格納され、これは派生クラス (B) をポイントしても変更されません。したがって、ポインターの型を変更するには型キャストが必要であり、出力は期待どおりです。

于 2013-08-09T14:11:48.167 に答える