这篇“c++类型转换及RTTI运行阶段类型识别的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“c++类型转换及RTTI运行阶段类型识别的方法是什么”文章吧。
static_cast
仅当type_name可以被隐式转换为expression所属类型或expression可隐式转换成type_name所属类型时,上述转换才是合法的。
static_cast是用得最多的一类类型转换符,常见的枚举值转成整形,float转整形之类的,都是可以的。
另外,static_cast还可以将派生类指针转换为基类指针,而且一定条件下还能将基类指针转换为派生类指针,且不会报错,只是一些只有派生类才会有的函数、成员变量,转换过来的指针也不会有
Test test;
TestDerived derived;
cout << "----------" << endl;
Test* tp = static_cast<Test*>(&derived);
tp->func();
cout << "-----------------" << endl;
TestDerived* dp = static_cast<TestDerived*>(&test);
dp->func();
dp->speak();
//以下是控制台输出
----------
TestDerived func
-----------------
test func
dynamic_cast运算符的语法和static_cast一样,但它的作用和static_cast略有区别。
kotlin中有个语法叫 is
,本人觉得dynamic_cast就是kotlin中的is
。
dynamic_cast,一般只用于基类和派生类之间的转换,而且只能用于派生类指针转换成基类指针,不能反向转换
if (Test* tpp = dynamic_cast<Test*>(&derived)) {
cout << "devived can cast to test" << endl;
}
if (TestDerived* dpp = dynamic_cast<TestDerived*>(&test)) {
cout << "test can cast to TestDerived" << endl;
}
//输出
devived can cast to test
如代码所示,如果dynamic_cast转换成功,将返回一个指针,如果转换失败,将返回一个空指针。所以代码中的两个if判断,只有一个生效。看这种调用方式,是不是和kotlin中的 is
很相象呢
const_cast运算符,只用于执行一种用途的类型转换,即改变值为const或volatile。
它一般用于去const运算符。但去运算符之后的效果却是难以预料。
const int num = 10;
const int* tempN = const_cast<const int*>(&num);
cout << "tempn = " << *tempN << endl;
int* temppp = const_cast<int*>(tempN);
*temppp = 20;
cout << "num = " << num << " tempn = " << *tempN << " temppp = " << *temppp << endl;
输出:
tempn = 10
num = 10 tempn = 20 temppp = 20
如上述代码所示,num是const类型的整形值,它的值始终为10,无法更改。这种转换慎用
没有啥特殊场景运用,类似于c语言中的强制转换,一般用得极少。
RTTI,运行阶段类型识别的简称。
在多态中,比如上面代码中有基类Test和TestDerived,现在有一个Test指针,但不知道这个指针究竟指向的是基类还是派生类,怎么知道指针是指向的哪种对象呢?
这就是RTTI的工作,在运行时判断类型。目前c++中有3个支持RTTI的元素:
dynamic_cast,将一个指向基类的指针来生成一个指向派生类的指针,否则,该运算符将返回空指针
typeid,返回一个指针对象类型的值
type_info,结构存储了有关特定类型的信息
RTTI场景下,父类必须要有虚函数信息,因为RTTI信息存储在虚函数表中。
以上就是关于“c++类型转换及RTTI运行阶段类型识别的方法是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://juejin.cn/post/7225092351358189624