2010-12-13 9 views
0

C++で基底クラスAへのポインタを持っていれば、ポインタが派生クラスBまたはCにあることをコードでどのように伝えることができますか?オブジェクトの種類を確認する

+1

これはあなたが望むものですか? http://stackoverflow.com/questions/351845/finding-the-type-of-an-object-in-c – dheerosaur

答えて

6

基本クラスAが多型である(つまり少なくとも1つの仮想関数を持つ)と仮定すると、dynamic_castを使用できます。与えられたA* ap;

if (B* bp = dynamic_cast<B*>(ap)) { 
    // the object is a B 
} 
else if (C* cp = dynamic_cast<C*>(ap)) { 
    // the object is a C 
} 
+0

可読性を向上させ、「あなたがコンパイルしたから」と言ったのを避けるために、私はprever 'if((blah)!= 0)'となります。味のちょうど問題です。 – sje397

+1

@ sje397:この場合の「blah」は式ではなく、宣言であるため、動作しません。それは宣言であるため、 '='は 'operator ='ではなく、ほとんどのコンパイラがここで警告を出すとは思わない。 –

+0

@James:それでもそれを得られない - 'if' yesの条件として動作するには、何か 'false'に評価する必要がありますか? – sje397

1

別のアプローチ、

if (typeid(*pBase) == typeid(A)) 
{ 
     cout << "A" << endl; 
} 
else if (typeid(*pBase) == typeid(B)) 
{ 
     cout << "B" << endl; 
} 
else if (typeid(*pBase) == typeid(C)) 
{ 
     cout << "C" << endl; 
} 
else 
{ 
     cout << "something else" <<endl; 
} 

しかし、私は、ジェームズのアプローチを好むあなただけタイプを決定するものではありませんが、あなたはまた、タイプ - を持っていることを使用しているためその後、で動作するキャストされたインスタンス!

2

あなたが一般的に知っている必要はありません。

struct A { 
    virtual int generate_foo() = 0; 
}; 

struct B : A { 
    int generate_foo() { return 42; } 
}; 

struct C : A { 
    i_; 
    C(int i) : i_(i) { } 
    int generate_foo() { return i_++; } 
}; 

あなたはA*を持っている場合は、(1)それはgenerate_foo()メソッドを持っていることを知っているし、(2)generate_foo()がために適切なFOOを生成することを知っていますあなたが本当に持っているものは何でも。一般的には十分である必要があります。はの場合、に追いつくことができます。

哲学的には、C++の設計者は、実行時の型情報の追加を避けるために何年も費やしてきました。しかし、彼らは最終的に彼らが失われた戦いの間違った終わりにいたことを決め、dynamic_casttypeinfo()を追加しました。 C++ 0xはもっと多くを追加します。

関連する問題