2011-06-27 9 views
1

私はを持っており、BCで拡張されているとしましょう。さて、多態性が必要な場合は、ベースクラスポインタを使用して、派生クラスオブジェクトを指し示します。多型中にオブジェクトの型を特定する

A *a = new B(); OR A *a= new C(); 

ここで、私はいくつかのステートメントを実行したとしましょう。今、私は基本クラスのポインタが指しているオブジェクトの型を識別することに興味があります。これはどうすればできますか?

+0

なぜ「多形の欲しい」と言いますか? 2つの派生クラスによって拡張された基本クラス_is_多型。あなたは多態性を持っています! –

+1

これを行う方法はありますが、通常はデザインの欠陥を示します。オブジェクトをポリモーフィックに使用したい、または使用できない、つまりポリモーフィックインターフェイスが必要なだけのものを提供するか、ポリモーフィズムを使用しないほうが良いです。あなたが本当の問題を述べるなら、人々はより良​​い選択肢を思いつくかもしれません。 –

答えて

8

直接的な方法は、使用することですdynamic_cast:本当の答えはあなたがポリモーフィズムの権利を行う際に必要としないですが

B* b = dynamic_cast<B*>(a); 
if(b != 0) { 
    // the object can be cast to class B safely 
} 

- あなたは仮想関数を使用して、派生クラスでそれらを適切に実装する必要がありますあなたは盲目的にそれらを呼び出すことができ、適切なコードを実行することができます。

+0

+1本当の答えは重要です。多型を直ちに取得します。 – daramarak

2

に依存します。

typeidを使用すると、すばやく汚れたタイプの識別ができます。

dynamic_castを使用して、指定したタイプのオブジェクトがあるかどうかを確認できます(驚いたことに、これはtypeidより速くなる可能性があります)。

最も派生したオブジェクトに興味がある場合は、ハッシングの目的のために、静的に既知のクラスが多形である場合はdynamic_cast<void*>を使用できます。これは間接的にタイプの識別です。これは、最も派生した型のオブジェクトへのvoidポインタを生成します。これは、オブジェクトの一意の「アドレス」と考えることができます。

しかし、一般的には、逐次化–を除いて、正確な型を特定するのは良い考えではありません。

乾杯& HTH。

関連する問題