运行时类型识别RTTI
RTTI(Run-Time Type Identification,运行时类型识别): 它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。
在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid。
- dynamic_cast允许运行时刻进行类型转换,并会进行继承转换类型安全检查,从而使程序能够在一个类层次结构中安全地转化类型,与之相对应的还有一个非安全的转换操作符static_cast。
- typeid在类中有虚函数的情况下,可以获取对象运行时的类型。
typeid
- typeid是C++的关键字之一,等同于sizeof这类的操作符。
- typeid操作符的返回结果是名为type_info的标准库类型的对象的引用。如typeid(param).name() 返回字符数+类型名。返回值肯能会因编译器不同,所以判断相同最好用
int a = 2; typeid(a) = type(int);
- 如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时计算;否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
// typeid(param).name() 返回字符数+名字
#define printClasstype(cls) cout << #cls << "\t: " << typeid(cls).name() << endl;
#define output(str) cout << "---" << #str << "---"<< endl;
class BaseA {};
class DeriveA : public BaseA {};
class BaseB {virtual void f(){}};
class DeriveB : public BaseB{};
int main()
{
output(直接输出类名);
printClasstype(BaseA);
printClasstype(DeriveA);
output(无虚函数)
BaseA a;
DeriveA da;
printClasstype(a);
printClasstype(da);
output(有虚函数)
cout << "1. 无指针:" << endl;
BaseB b;
DeriveB db;
printClasstype(b);
printClasstype(db);
cout << "2. 有指针:" << endl;
BaseB* p = &b;
BaseB* dp = &db;
cout << "指针指向的对象:" << endl;
printClasstype(*p);
printClasstype(*dp);
cout << "指针本身:" << endl;
printClasstype(p);
printClasstype(dp);
return 0;
}
宏操作
代码中涉及的宏展开操作:https://blog.csdn.net/qq_44813641/article/details/134945665