2011-01-16 11 views
2

このコードがBaseを出力する理由を私に説明することはできますか? typeidの定義によりTypeidの動作がC++で

#include <iostream> 
#include <cstdio> 
using namespace std; 

class Base; 
void testClassType (Base& b); 
class Base 
{ 
virtual void f(){}; 
}; 

class Derived :public Base 
{ 
}; 

int main() 
{ 
Base b; 
Derived d; 
testClassType(b); 
testClassType(d); 

} 
void testClassType(Base& b) 
{ 
    cout<<endl<<"It is:"<<typeid(b).name(); 
} 
+1

具体的な回答はありません。しかし、 'type_info :: name'の内容にはC++標準によって保証されていないことを指摘する価値があります。ですから、特定の値を含んだそれに頼るべきではありません。 –

答えて

8

は、多型タイプの発現および非多型タイプの式の静的タイプの動的タイプを返します。

多型は、少なくとも1つの仮想関数を持つクラス型です。あなたのケースでは

、あなたがtestClassType(d)を呼び出し、表現b機能testClassType内部に持っている静的な型Baseと動的な型Derived。ただし、Baseに1つの仮想関数を指定しないと、typeidは常に静的タイプ - Baseを報告します。 Base多型を作成すると、コードはbの動的タイプを報告します。これはDerivedです。

さらに、Oliがコメントに正しく記載しているように、type_info::name()メソッドの結果には意味のある情報が含まれているとは限りません。すべての型に同じ文字列の"Hello World"を返すことができます。

+1

name()は最も一般的なコンパイラでは意味があることに注意してください。標準では、戻り値が 'implementation defined'であることを示しています。これは、コンパイラがその動作を文書化しなければならないことを意味します。私はMSコンパイラとgccの両方がここにあるものを正確に指定していると思う。コンパイラのドキュメントをチェックして、値が明確になっていることを確認する限り、 –

2

少なくとも1つの仮想メンバ関数を持つクラスは、多相クラスと呼ばれます。

多態性クラスの各インスタンスは、インスタンス化に使用された元のクラスを実行時に(何らかの形で)関連付けています。これは例えばtypeid。また、仮想メンバー機能の呼び出しにも使用できます。

fを削除してクラスを非ポリモフィックにすると、testClassTypeで知られているのは、Baseです。型の実行時検査はありません。

乾杯&hth。、

関連する問題