C++语言学习(十九)——C++类型识别

本文详细介绍了C++中的类型识别,包括type_info结构体、typeid关键字和dynamic_cast关键字的使用。此外,还讨论了C++的类型转换,如向上类型转换、向下类型转换及其在多继承情况下的应用。C++的内省机制主要依赖RTTI,允许在运行时查询对象信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++语言学习(十九)——C++类型识别

一、C++类型识别简介

1、C++类型识别简介

C++是静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改。
C++语言中,静态类型是对象自身的类型,动态类型是指针(引用)所指向对象的实际类型。
RTTI(Run-Time Type Information)即运行时类型识别,C++通过RTTI实现对多态的支持。
为了支持RTTI,C++提供了一个type_info类和typeid与dynamic_cast两个关键字。

2、type_info结构体

type_info :
  存储特点类型的相关信息,常用来比较对象类型,type_info类的具体内容由编译器实现来决定。其声明如下:

class type_info {
public:
    virtual ~type_info();
    bool operator== (const type_info& rhs) const;
    bool operator!= (const type_info& rhs) const;
    bool before (const type_info& rhs) const;
    const char* name() const;
private:
    type_info (const type_info& rhs);
    type_info& operator= (const type_info& rhs);
};

type_info的构造函数和赋值操作符为私有,因此,程序中创建type_info对象的唯一方法是使用typeid操作符。C++标准只是告诉编译器需要实现type_info::name函数,但不同的编译器实现各不相同,因此typeid(int).name()不同编译器编译运行后输出不一样。

3、typeid关键字

typeid:
  typeid语法规则如下:typeid(expr);
  typeid表达式返回type_info类型,expr可以是各种类型名,对象和内置基本数据类型的实例、指针或者引用。当作用于指针和引用时,将返回实际指向对象的类型信息。
  如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时确定;否则,typeid操作符返回表达式的静态类型,在编译时就可以确定。
  当把typeid作用于指针的解引用p时,若指针p为0,则:如果p指向的类型是带虚函数的类类型,则typeid(p)在运行时抛出一个bad_typeid异常;否则,typeid(*p)的结果与p的值是不相关的,在编译时就可以确定。

4、dynamic_cast关键字

dynamic_cast:
  动态类型转换,运行时类型安全检查。dynamic_cast会检查待转换的源对象是否真的可以转换成目标类型,这种检查不是语法上的,而是真实情况的。许多编译器都是通过vtable找到对象的RTTI信息的,如果基类没有虚方法,也就无法判断一个基类指针变量所指对象的真实类型。
  dynamic_cast将一个指向基类的指针转换为一个指向派生类的指针,如果不能正确转换,则返回空指针。
C++语言提供了typeid关键字用于获取类型信息,typeid关键字返回对应参数的类型信息。typeid返回一个type_info类对象,当typeid的参数为NULL时将抛出异常。typeid的参数既可以时类型也可以是变量,当参数为类型,返回静态类型信息;当参数为变量,如果不存在虚函数表,返回静态类型信息,如果存在虚函数表,返回动态类型信息。
typeid操作符的返回结果是名为type_info的标准库类型的对象的引用。
typeid在不同C++编译器实现是不同的。

R

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值