栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++ RTTI

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ RTTI

类型识别

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(phuman);
pmen->testfunc();

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/982912.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号