2009-11-19 1 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? Например, как я могу знать, что 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

Вы можете просто Google что-то вроде C++ TypeId например, и получить что-то вроде этого: сзади http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/the_typeid_operator.htm

:)

+0

или даже http://en.wikipedia.org/wiki/Typeid – Gyuri

+0

Да, но это не отвечает на вопрос OP, а именно, заданы ли два типа «a» и «b», можно ли определить, является ли 'a' базовым классом' b'. (Похоже, это невозможно, конечно же, это невозможно в * переносном * C++.) – Quuxplusone

0

typeid непрозрачный. Он не должен быть формой отражения. Тем не менее, выполнение нулевой проверки возврата из dynamic_cast, вероятно, так же быстро пытается пересечь структуры typeid для определения отношений классов. Придерживайтесь dynamic_cast в коде pre-C++ 0x.

Смежные вопросы