C++ 类型判断

C++ 类型判断 完整详解

C++ 常用三种方式做类型判断:

  1. typeid 运行时类型识别
  2. decltype 编译期类型推导
  3. 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 常见坑点

  1. 没有虚函数
    基类指针指向子类,typeid 只会识别为基类,判断失效。
  2. typeid(指针)typeid(*指针) 不一样
typeid(p)      // 判断的是 指针类型 Base*
typeid(*p)     // 判断的是 指向的 对象真实类型
  1. type_info::name() 名字是编译器自定义,不同编译器显示不一样,不要用来字符串比对

六、三种方式选型总结

  1. 普通基础类型判断typeid
  2. 继承多态、安全向下转型判断dynamic_cast(首选)
  3. 编译期自动推导类型decltype
  4. 需要运行时识别真实子类 → 基类加虚函数 + typeid(*obj)
posted @ 2026-04-24 12:01  张山山  阅读(4)  评论(0)    收藏  举报