C++ 类型判断
C++ 类型判断 完整详解
C++ 常用三种方式做类型判断:
typeid运行时类型识别decltype编译期类型推导dynamic_cast多态安全类型判断(继承体系)
一、typeid 运行时类型判断
1. 头文件
#include <typeinfo>
2. 基础用法
typeid(变量/表达式/类型)
返回:std::type_info 对象
作用:运行时获取真实类型、判断类型是否相等。
3. 基础示例
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
int a = 10;
double b = 3.14;
// 判断类型是否一致
if (typeid(a) == typeid(int))
{
cout << "a 是 int 类型" << endl;
}
// 输出类型名字
cout << typeid(b).name() << endl;
return 0;
}
4. 关键特性
- 普通类型:精准判断
- 多态类(有虚函数):识别对象真实子类类型
- 非多态类:只识别静态声明类型,不会识别实际子类
二、多态场景:typeid 判断真实对象类型
#include <iostream>
#include <typeinfo>
using namespace std;
class Base {
public:
virtual void fun() {} // 必须有虚函数,开启RTTI
};
class Derive : public Base {};
int main()
{
Base* p = new Derive;
if (typeid(*p) == typeid(Derive))
{
cout << "p 实际指向 Derive 子类" << endl;
}
return 0;
}
✅ 有虚函数 + typeid(*指针) → 获取真实对象类型
三、dynamic_cast 类型安全判断(最常用)
专门用来:
判断基类指针/引用 是否属于某个子类
转换失败:
- 指针:返回
nullptr - 引用:抛异常
Base* p = new Derive;
// 尝试转为子类
Derive* d = dynamic_cast<Derive*>(p);
if (d != nullptr)
{
cout << "类型匹配,转换成功" << endl;
}
✅ 工程中优先用 dynamic_cast 做多态类型判断,安全稳定。
四、decltype 编译期获取类型
typeid 是运行时查看;
decltype 是编译期推导变量/表达式类型。
int a = 10;
// 推导 a 的类型,定义新变量
decltype(a) b = 20;
用途:模板编程、自动推导复杂类型,不做运行时判断。
五、typeid 常见坑点
- 没有虚函数
基类指针指向子类,typeid只会识别为基类,判断失效。 typeid(指针)和typeid(*指针)不一样
typeid(p) // 判断的是 指针类型 Base*
typeid(*p) // 判断的是 指向的 对象真实类型
type_info::name()名字是编译器自定义,不同编译器显示不一样,不要用来字符串比对。
六、三种方式选型总结
- 普通基础类型判断 →
typeid - 继承多态、安全向下转型判断 →
dynamic_cast(首选) - 编译期自动推导类型 →
decltype - 需要运行时识别真实子类 → 基类加虚函数 +
typeid(*obj)
浙公网安备 33010602011771号