2009-11-19 16 views
3

我一直在使用dynamic_cast來確定對象的父子關係。可能使用typeid來確定父子關係

#include <iostream> 

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

class B : public A { 
}; 

class C : public A { 
}; 

int main() 
{ 
    B b; 
    std::cout<< typeid(b).name()<< std::endl;  // class B 

    A* a = dynamic_cast<A *>(&b); 
    if (a) { 
     std::cout<< "is child of A"<< std::endl; // printed 
    } 

    C* c = dynamic_cast<C *>(&b); 
    if (c) { 
     std::cout<< "is child of C"<< std::endl; // Not printed 
    } 
    getchar(); 
} 

我可以知道是否有可能通過typeid來確定對象的父 - 子關係?例如,如何通過使用typeid檢查來知道B是A的孩子?

謝謝。

回答

4

我不認爲你可以在當前的C++中使用typeinfo中的信息。我知道boost::is_base_of(類型特徵將是的C++ 0x部分):

if (boost::is_base_of<A, B>::value) // true 
{ 
    std::cout << "A is a base of B"; 
} 
+0

http://www.boost.org/doc/libs/release/libs/type_traits/doc/html/boost_typetraits/reference/is_base_of.html – 2009-11-19 02:02:36

-1
+0

甚至http://en.wikipedia.org/wiki/Typeid – Gyuri 2009-11-19 01:51:58

+0

是的,但是這並沒有回答OP的問題,即是否給出了兩個typeid'a'和'b',可以判斷'a'是否是'b'的基類。 (看起來這不太可能;當然在* portable * C++中是不可能的)。 – Quuxplusone 2015-10-05 02:15:54

0

typeid是不透明的。這並不意味着是一種反思。也就是說,對來自dynamic_cast的返回進行空檢查可能與嘗試遍歷typeid結構以確定類關係一樣快。在pre-C++ 0x代碼中使用dynamic_cast。