c++ RTTI

本文探讨了C++中的运行时类型识别(RTTI)和动态类型转换的重要性。RTTI允许程序员在运行时检查对象的实际类型,而dynamic_cast则用于安全地将父类指针转换为子类指针。通过这两个机制,多态性得以有效管理和利用,解决了在复杂的继承体系中确定对象具体类型的问题。同时,文章也展示了如何在实际代码中使用typeid和dynamic_cast进行类型判断和转换。
摘要由CSDN通过智能技术生成

类型识别

RTTI的意思是运行时类型识别,之所以存在这个功能,是因为c++通过父类指针实现多态,父类指针可以指向自己所有的派生类对象,指的多了就会出现问题,程序到某一时刻,父类指针究竟指向哪种派生类对象呢?

Human *phuman = new Men;

假设有个父类是Human,子类是Men(毕竟男人属于人类的一种)。通过以上语句,令Human类型的指针指向一个Men对象,Human类中存在虚函数,因此构成了一种多态。

但是时间久了,隔了好多行代码,Human这个父类又有一堆子类,因此很容易在某个时间节点搞不清楚当前的*phuman指向的到底是哪种类型,因此需要额外手段进行判断。

cout << typeid(*phuman).name() << endl;

通过typeid运算符可以得知当前父类指针指向的类型。

可以看到,程序打印出了“class Men”,说明当前*phuman指向的是一个Men类型的对象。

类型转换

除了识别当前父类指针指向的子类类型之外,还需要考虑一个问题:多态实现了父类指针对子类虚函数的调用,这很方便。但是子类的函数未必都是虚函数,有些成员函数是非虚的,并不能通过父类指针进行调用,那该怎么办?

这个时候就需要对父类指针进行转换了,将其转换为正确的子类指针。当然,前提是已经清楚父类指针当前指向的对象的类型。

Men *pmen = dynamic_cast<Men*>(phuman);
pmen->testfunc();

通过dynamic_cast运算符可以将一个基类指针转换为一个父类指针。该运算符其实主要是为开发者进行一个检查,如果*pmen的结果是nullptr的话,说明*phuman指向的并不是一个Men类型的对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值