#创作计划# C++中的RTTI
2025-08-23 08:48:46
发布于:广东
前言
本文章介绍了:什么是RTTI,RTTI的作用,RTTI的使用方法等。
什么是RTTI
RTTI(Runtime Type Identification,运行时类型识别),用于在程序运行时动态确定对象类型。
RTTI的用途
可能会有人说:啊你个没用的,C++又不像Python,类型都是确定的,有什么用啊
那当然有用了,毕竟类型确定,如果是个指针,指向的类型还不确定呢。
这里需要一些关于类的多态的知识,如果不了解可以参阅:https://www.acgo.cn/discuss/study/54581
在类的多态中,当使用一个基类指针/引用操作一个派生类中覆写的虚函数,就需要RTTI来确定调用的是哪个派生类,从而决定调用虚函数的覆写版本。
当然,还有一些情况要用到RTTI——比如确定调用派生类的具体版本,或者是想对指针进行安全转换等。
RTTI只能用于包含虚函数的类。
如何使用RTTI
在C++中,默认提供了3种使用RTTI的方法:
dynamic_cast
typeid
type_info
dynamic_cast
dynamic_cast
是C++中最常用的RTTI组件,一般用于在类的继承操作中确定是否可以安全转换指针/引用从一个类的指针/引用到另一个类的指针/引用。
dynamic_cast
主要用于多态,如要确定基类指针指向的派生类对象类型,或者要操作某个派生类中的成员函数,但该成员函数在其他派生类中可能并不存在。
dynamic_cast
的语法如下:
dynamic_cast<Type*>(pt);
要用于引用,将
*
换为&
。
其中Type
是一个类,pt
是指向一个类对象的指针/引用。
可能的结果如下:
- 如果转换成功,
dynamic_cast
将返回转换后的值。 - 如果转换失败且目标类型是一个指针,将返回目标类型的空指针。
- 如果转换失败且目标类型是一个引用,将抛出异常
std::bad_cast
。
要处理这个异常,需要导入头文件<typeinfo>
。
例如这个程序:
#include<bits/stdc++.h>
using namespace std;
class A{
public:
virtual void print(){
cout << "A" << endl;
}
};
class B : public A{
public:
void print(){
cout << "B" << endl;
}
void print2(int i){
cout << i << endl;
}
};
int main(){
A* a = new A;
B* b = new B;
A* c = dynamic_cast<A*>(b);//正确,将派生类指针转换为基类
B* d = dynamic_cast<B*>(a);//错误,程序期望基类拥有派生类特征
cout << c << ' ' << d;
return 0;
}
运行程序,输出0xbc1550 0
由于第二个dynamic_cast
期望基类A
拥有派生类B
的成员函数print2()
,而基类A
实际上并没有该函数,所以返回空指针。
dynamic_cast
可能导致转换失败的原因:
- 如果一个派生类定义了基类没有的成员,而
dynamic_cast
试图将基类指针转换为派生类指针时将转换失败。
type_id
运算符和type_info
类
typeid
接受两种参数:
- 类名;
- 结果为对象的表达式。
其返回一个对type_info
对象的引用,其中type_info
是在typeinfo
头文件中定义的。
type_info
类重载了==
和!=
运算符,从而可以使用这两个运算符对类型进行比较。
持续更新
这里空空如也
有帮助,赞一个