测试环境 mac m1 Apple clang version 13.0.0 (clang-1300.0.29.30)
#include#include using std::cout; using std::endl; class base{}; class Sub : public base {}; class base1{ public: virtual ~base1() {} }; class Sub1 : public base1 {}; int main() { int a; cout << "int a typeid name " << typeid(a).name() << endl; bool b; cout << "bool b typeid name " << typeid(b).name() << endl; char c; cout << "char c typeid name " << typeid(c).name() << endl; double d; cout << "double d typeid name " << typeid(d).name() << endl; float f; cout << "float f typeid name " << typeid(f).name() << endl; base base; cout << "base base typeid name " << typeid(base).name() << endl; Sub sub; cout << "Sub sub typeid name " << typeid(sub).name() << endl; base & base_ = sub; cout << "base & base_ typeid name " << typeid(base_).name() << endl; base* pbase = ⊂ cout << "base* pbase typeid name " << typeid(pbase).name() << endl; cout << "(*pbase) typeid name " << typeid(*pbase).name() << endl; base1 base1; cout << "base1 base1 typeid name " << typeid(base1).name() << endl; Sub1 sub1; cout << "Sub1 sub1 typeid name " << typeid(sub1).name() << endl; //含有虚函数时 能够识别真实类型 base1 & base1_ = sub1; cout << "base1 & base1_ typeid name " << typeid(base1_).name() << endl; base1 * pbase1 = &sub1; cout << "base1 * pbase1 typeid name " << typeid(pbase1).name() << endl; cout << "*pbase1 typeid name " << typeid(*pbase1).name() << endl; }
结果输出 int a typeid name i bool b typeid name b char c typeid name c double d typeid name d float f typeid name f base base typeid name 4base Sub sub typeid name 3Sub base & base_ typeid name 4base base* pbase typeid name P4base (*pbase) typeid name 4base base1 base1 typeid name 5base1 Sub1 sub1 typeid name 4Sub1 base1 & base1_ typeid name 4Sub1 base1 * pbase1 typeid name P5base1 *pbase1 typeid name 4Sub1
小结 当基类中存在虚函数时,引用或者指针解引用 能够识别出真实类型



