cpp中typeid举例:
#include <iostream> #include <typeinfo> //for 'typeid' using namespace std; class Person { public: // ... Person members ... virtual ~Person() {} }; class Employee : public Person { // ... Employee members ... }; int main() { Person person; Employee employee; Person *ptr = &employee; Person &ref = employee; // The string returned by typeid::name is implementation-defined std::cout << typeid(person).name() << std::endl; // Person (statically known at compile-time) std::cout << typeid(employee).name() << std::endl; // Employee (statically known at compile-time) std::cout << typeid(ptr).name() << std::endl; // Person * (statically known at compile-time) std::cout << typeid(*ptr).name() << std::endl; // Employee (looked up dynamically at run-time // because it is the dereference of a // pointer to a polymorphic class) std::cout << typeid(ref).name() << std::endl; // Employee (references can also be polymorphic) Person* p = 0; try { typeid(*p); // not undefined behavior; throws std::bad_typeid // *p, *(p), *((p)), etc. all behave identically }catch (...){ cout << "NULL pointer!"<<endl; } Person& pRef = *p; // undefined behavior, dereferences null typeid(pRef); // does not meet requirements to throw std::bad_typeid Employee e; Person pp; Person &per_ref = pp; try{ Employee & em_ref = dynamic_cast<Employee&>(per_ref); }catch(bad_cast e){ cout << "bad cast : not valid type reference !" <<endl; }catch(...){ cout << "not valid type reference !" <<endl; } // because the expression for typeid is not the result // of applying the unary * operator; behavior is undefined }