C++ typeid的使用

运行时类型识别RTTI

RTTI(Run-Time Type Identification,运行时类型识别): 它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。
在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid。

  • dynamic_cast允许运行时刻进行类型转换,并会进行继承转换类型安全检查,从而使程序能够在一个类层次结构中安全地转化类型,与之相对应的还有一个非安全的转换操作符static_cast。
  • typeid在类中有虚函数的情况下,可以获取对象运行时的类型。

typeid

  1. typeid是C++的关键字之一,等同于sizeof这类的操作符。
  2. typeid操作符的返回结果是名为type_info的标准库类型的对象的引用。如typeid(param).name() 返回字符数+类型名。返回值肯能会因编译器不同,所以判断相同最好用
int a = 2; typeid(a) = type(int);
  1. 如果表达式的类型是类类型且至少包含有一个虚函数,则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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值