typeid
如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时计算;
否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。
1、返回值和参数
// 返回值类型 type_info // 标准库类型,相当于一个类 // 其中有成员函数 name() 可以显示当前类型的名字 // 参数类型 可以是变量名,也可以是变量类型名 typeid(指针/引用); typeid(表达式);
2、主要用途
比较两个指针是否指向同一种类型
class Human; // 基类 class Men : public Human; class Women : public Human; int main() { Human* pMen = new Men; Human* pWomen = new Women; if (typeid(pMen) == typeid(pWomen)) { // 该条件成立,得到的都是Human 类型 } if (typeid(*pMen) == typeid(*pWomen)) { // 该条件不成立,对比的是两个指针所指内容的类型 } if (typeid(*pMen) == typeid(Men)) { // 直接将指针所指的内容,去与期望的类型比较 } // 所以如果要对比的是指针所指向的内容是否相同,则需要加*,得到其所指内容 // 注意:前提是Human中有虚函数,才具有多态性 }
3、type_info 类
// 常用函数 name() 返回值为char const * char const * a = typeid(int).name();
// type_info与虚函数表的关系 // 虚函数表中有很多项,每一项都指向一个虚函数的入口地址 // 虚函数表的第一项比较特殊,指向的是这个类关联的 type_info 对象