2012-10-01 26 views
1

假設我有一個基類對象的向量,但用它來包含一些派生類。我想檢查該矢量的成員是否屬於特定的類。我怎麼做?我可以考慮製作一個接受基類參數的派生類模板,但我不知道如何將類與對象進行比較。如何在C++中檢查對象的類?

+0

這裏是一個可能的地方開始:http://stackoverflow.com/questions/351845/finding-the-type-of-an-object-in-c – MikeB

+5

如果你有一個基類對象的向量,你沒有任何派生類型的對象;當它們被存儲在載體中時它們被切成片。 –

+1

真正的問題是爲什麼你需要知道類型。往往不是這是一個設計缺陷。 –

回答

0

可以使用dynamic_cast

但是如果你需要做到這一點,那麼你可能有一個設計問題。你應該使用多態或模板來解決這個問題。

2

如果你的基類有一些虛擬成員(即它是多態的,因爲我認爲它應該是這種情況),你可以試着down cast每個成員找出它的類型(即使用dynamic_cast)。

否則,您可以使用RTTI(即typeid)。

0

試試下面這個例子:

#include <iostream> 
using namespace std; 

#include <typeinfo> 

class A 
{ 
public: 
    virtual ~A() 
    { 
    } 
}; 

class B : public A 
{ 
public: 
    virtual ~B() 
    { 
    } 
}; 

void main() 
{ 
    A *a = new A(); 
    B *b = new B(); 

    if (typeid(a) == typeid(b)) 
    { 
     cout << "a type equals to b type\n"; 
    } 
    else 
    { 
     cout << "a type is not equals to b type\n"; 
    } 

    if (dynamic_cast<A *>(b) != NULL) 
    { 
     cout << "b is instance of A\n"; 
    } 
    else 
    { 
     cout << "b is not instance of A\n"; 
    } 

    if (dynamic_cast<B *>(a) != NULL) 
    { 
     cout << "a is instance of B\n"; 
    } 
    else 
    { 
     cout << "a is not instance of B\n"; 
    } 

    a = new B(); 

    if (typeid(a) == typeid(b)) 
    { 
     cout << "a type equals to b type\n"; 
    } 
    else 
    { 
     cout << "a type is not equals to b type\n"; 
    } 

    if (dynamic_cast<B *>(a) != NULL) 
    { 
     cout << "a is instance of B\n"; 
    } 
    else 
    { 
     cout << "a is not instance of B\n"; 
    } 
}