首页 > 编程笔记 > C++笔记 阅读:4

C++ typeid和type_info类:获取表达式的类型信息(附带实例)

typeid 运算符在 C++ 中用于获取表达式的类型信息。

当对表达式使用 typeid 时,它返回一个引用,指向 std::type_info 对象,该对象由 <typeinfo> 头文件定义,提供了关于表达式类型的详细信息,使 typeid 成为在程序中检查和使用类型信息的一个重要工具。

type_info 类提供的关键成员函数之一是 name(),它返回一个表示类型名称的字符串。这可以用于输出日志、调试信息或在运行时进行类型比较。此外,type_info 还提供了 operator==() 和 operator!=(),允许比较两个类型是否相同。这在处理类型安全的转型和多态性时非常有用。

typeid 还可以用来比较两个表达式的类型是否相同。例如,在执行类型安全的向下转型或在多态结构中确认对象的实际类型时,typeid 的使用尤为重要。通过比较 typeid 操作符返回的 type_info 对象,程序可以安全地确定对象的具体类别。

以下简单示例展示的是如何使用 typeid 来识别和比较对象类型。
#include <iostream>
#include <typeinfo>
class Base {
public:
    virtual void print() { std::cout << "Base class" << std::endl; }
    virtual ~Base() {}
};
class Derived : public Base {
    void print() override { std::cout << "Derived class" << std::endl; }
};
int main() {
    Base* b = new Derived();
    // 利用 RTTI 的 typeid 运算符来确认动态类型
    std::cout << "The type of b is: " << typeid(*b).name() << std::endl;
    // 输出指向对象的实际类型(Derived),这是多态性的直接体现
    delete b;
    return 0;
}
运行结果为:
The type of b is: 7Derived
在这个示例中,通过使用 typeid 在运行时确定对象的实际类型,这种检查是通过 typeid 运算符实现的,它是 RTTI 系统的一部分,允许程序动态地检查和响应不同类型的对象。这对于涉及多态性的编程场景尤其有用,因为它允许类型安全地检索或操作对象。

这里的 7Derived 是 Derived 类型的 mangled 名称。7 是 GCC 和 Clang 编译器用来表示 Derived 类名称前缀的字符。

相关文章