文学起点网
当前位置: 首页 文学百科

c强制类型转换规则(c语言强制转化的正确使用)

时间:2023-05-23 作者: 小编 阅读量: 1 栏目名: 文学百科

dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。它对编译器有要求,需要编译器启动“运行时类型信息”这一选项。dynamic_cast与继承层次的指针对于“向下转型”有两种情况。当然,虚函数表的建立对效率是有一定影响的,构建虚函数表、由表查询函数都需要时间和空间上的消耗。所以,除了必须声明virtual,不要轻易使用virtual函数。对于虚函数的进一步了解,可以查看《EffectiveC++》

dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用。

>>>>>>>>>>>编译器的RTTI设置>>>>>>>>>>>

dynamic_cast提供RTTI(Run-Time Type Information),也就是运行时类型识别。它对编译器有要求,需要编译器启动“运行时类型信息”这一选项。当编译器不开启RTTI时,运行含有dynamic_cast操作符的程序时会出现一个警告:

warning C4541: “dynamic_cast”用在了带 /GR- 的多态类型“ANIMAL”上;可能导致不可预知的行为

VS2010在默认下是开启RTTI的,也可以自己手动去开启或者关闭,操作如下:

视图->解决方案资源管理器
在打开的解决方案管理器中,对着项目名称右击,选择属性
配置属性-〉C/C++

>>>>>>>>>>>>>步入正题>>>>>>>>>>>>>

  • dynamic_cast主要用于“安全地向下转型”

dynamic_cast用于类继承层次间的指针或引用转换。主要还是用于执行“安全的向下转型(safe downcasting)”,也即是基类对象的指针或引用转换为同一继承层次的其他指针或引用。至于“先上转型”(即派生类指针或引用类型转换为其基类类型),本身就是安全的,尽管可以使用dynamic_cast进行转换,但这是没必要的, 普通的转换已经可以达到目的,毕竟使用dynamic_cast是需要开销的。

class Base{public:Base(){};virtual void Show(){cout<<"This is Base calss";}};class Derived:public Base{public:Derived(){};void Show(){cout<<"This is Derived class";}};int main(){Base *base ;Derived *der = new Derived;//base = dynamic_cast<Base*>(der); //正确,但不必要。base = der; //先上转换总是安全的base->Show();system("pause");}学习交流群:894479708欢迎所有初学和进阶者一起讨论学习!

dynamic_cast与继承层次的指针

对于“向下转型”有两种情况。一种是基类指针所指对象是派生类类型的,这种转换是安全的;另一种是基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做检查,转换失败,返回结果为0;

#include "stdafx.h"#include<iostream>using namespace std;class Base{public:Base(){};virtual void Show(){cout<<"This is Base calss";}};class Derived:public Base{public:Derived(){};void Show(){cout<<"This is Derived class";}};int main(){//这是第一种情况Base* base = new Derived;if(Derived *der= dynamic_cast<Derived*>(base)){cout<<"第一种情况转换成功"<<endl;der->Show();cout<<endl;}//这是第二种情况Base * base1 = new Base;if(Derived *der1 = dynamic_cast<Derived*>(base1)){cout<<"第二种情况转换成功"<<endl;der1->Show();}else{cout<<"第二种情况转换失败"<<endl;}学习交流群:894479708欢迎所有初学和进阶者一起讨论学习!delete(base);delete(base1);system("pause");}

运行结果:

  • dynamic_cast和引用类型

在前面的例子中,使用了dynamic_cast将基类指针转换为派生类指针,也可以使用dynamic_cast将基类引用转换为派生类引用。

同样的,引用的向上转换总是安全的:

Derived c;Derived & der2= c;Base & base2= dynamic_cast<Base&>(der2);//向上转换,安全base2.Show();

所以,在引用上,dynamic_cast依旧是常用于“安全的向下转型”。与指针一样,引用的向下转型也可以分为两种情况,与指针不同的是,并不存在空引用,所以引用的dynamic_cast检测失败时会抛出一个bad_cast异常:

int main(){//第一种情况,转换成功Derived b ;Base &base1= b;Derived &der1 = dynamic_cast<Derived&>(base1);cout<<"第一种情况:";der1.Show();cout<<endl;//第二种情况Base a ;Base &base = a ;cout<<"第二种情况:";try{Derived & der = dynamic_cast<Derived&>(base);}catch(bad_cast)学习交流群:894479708欢迎所有初学和进阶者一起讨论学习!{cout<<"转化失败,抛出bad_cast异常"<<endl;}system("pause");}

运行结果:

  • 使用dynamic_cast转换的Base类至少带有一个虚函数

当一个类中拥有至少一个虚函数的时候,编译器会为该类构建出一个虚函数表(virtual method table),虚函数表记录了虚函数的地址。如果该类派生了其他子类,且子类定义并实现了基类的虚函数,那么虚函数表会将该函数指向新的地址。虚表是C++多态实现的一个重要手段,也是dynamic_cast操作符转换能够进行的前提条件。当类没有虚函数表的时候(也即一个虚函数都没有定义),dynamic_cast无法使用RTTI,不能通过编译(个人猜想…有待验证)。

当然,虚函数表的建立对效率是有一定影响的,构建虚函数表、由表查询函数 都需要时间和空间上的消耗。所以,除了必须声明virtual(对于一个多态基类而言),不要轻易使用virtual函数。对于虚函数的进一步了解,可以查看《Effective C++》

    推荐阅读
  • 卖火柴的小女孩主要讲了什么(卖火柴的小女孩讲述的是什么)

    卖火柴的小女孩主要讲了什么它讲述的是一个在圣诞夜卖火柴的小女孩的悲惨命运。因为没有卖掉一根火柴,小女孩一天没有吃东西。创作背景:1845年10月,安徒生再次访问意大利。在圣诞节即将到来的时候,格洛斯顿城的朋友们再三邀请安徒生去那里过圣诞节。安徒生兴冲冲地坐上了去格洛斯顿的马车。安徒生的马车在格洛斯顿的街道上缓缓前进,他要体会一下城市里的圣诞节气氛。安徒生回去以后就写了《卖火柴的小女孩》。

  • 芹菜炒木耳大白菜(钙含量是牛奶的3倍)

    韭菜炒豆芽的做法,就是这么简单,掌握好技巧,口感能提升不少,如果你认为韭菜炒豆芽的做法还不错,欢迎收藏起来学着做,或者是分享给更多的人学习!

  • 雅典为什么会繁华(同属希腊地区的雅典和斯巴达)

    古希腊城邦奴隶制得到如此广泛推行为日后城邦时代社会经济的发展以及各行各业的繁荣提供了重要条件。这也使得希腊城邦的奴隶制经济得到了空前规模的发展,尤其是在以雅典和斯巴达两大城邦的代表下,古希腊城邦时代迎来了其奴隶制社会经济发展的黄金时代。雅典型的奴隶制经济代表着古希腊城邦时代奴隶制社会发展的整体面貌,而斯巴达型的奴隶制经济只是局限于那些经济较为落后的城邦当中。

  • 电饭锅腊肠饭做法(电饭锅腊肠饭最简单的做法介绍)

    下面希望有你要的答案,我们一起来看看吧!电饭锅腊肠饭做法主料是腊肠、米,辅料是胡萝卜、玉米、葱、盐、鸡粉。先把材料准备好,大米洗净,腊肠切丁,玉米粒胡萝卜切丁,备用。电饭锅内放少许油,依照顺序放入胡萝卜,玉米腊肠,加入盐,鸡粉,酱油翻炒片刻,接着放入米,水量和平常一样,按下开关煮饭就可以了。开关跳了后,撒上些香葱,加入些酱油调味拌匀即可出锅。

  • 地笼放什么饵料(地笼的介绍)

    下面内容希望能帮助到你,我们来一起看看吧!地笼放什么饵料地笼里面放的饵料比较好的:大骨头稍微有一点点肉屑。还有红虫但数量要多一些。还可以鸡鸭骨头等等腥味越大越好。地笼是中原地区的业余或专业捕鳝或泥鳅,河虾小鱼等的工具。地笼的长度可依据养殖水面的长度、宽度而定,一般为15节左右,总长约7~8米。材质为塑料纤维。地笼有很多入口,但内部构造比较复杂,鱼类进去后就很难出来。

  • 卡路里最低的食物排行(卡路里最低的食物有哪些)

    卡路里最低的食物排行芝麻菜。芝麻菜在日常生活中是比较常见,不仅含有低热量低脂肪和低胆固醇,而且高纤维和大量的维生素A,K,C以及其它丰富的营养。西兰花低热量、丰富维生素、大量矿物质及抗氧化剂,可降低各种癌变的发生率。绿豆芽热量较低,水分和膳食纤维较高。西红柿果实营养丰富,具特殊风味。

  • 新买的内衣有很大的味道怎么回事 新买的内衣有很大的味道怎么回事呀

    不少女性朋友可能有这样的困扰,新买的内衣挂在内衣店里没有异味,可是拿回家洗一遍之后却散发出很大的味道。内衣长期挤压产生味道新买的内衣从生产到购买经过了较长的时间,而在此期间内衣被长时间闷在包装袋里面或者是长时间受到挤压,这也容易使内衣在包装袋中产生很大的味道。

  • 修车最容易被更换的零件(更换下来的旧件哪些可以卖掉)

    可以最大程度上降低我们的损失呢?第4个零部件就是发动机以及空调压缩机了,相信我们都应该知道,车辆当中最为贵重的零部件就是发电机,所以如果我们的车辆出现问题时,发电机也能够卖到一个非常好的价钱。但前提是一定要经过维修之后还可以再次使用的,才能够进行售卖,如果没有维修价值了的话,也只能够是当废铁卖掉。

  • 孕妇晚期腰痛可以按摩吗(孕妇腰酸可以按摩缓解吗)

    孕妇腰酸可以按摩缓解吗孕期随着腹中胎儿越长越大,身体会变得笨重,由于重心前移,增大的子宫压迫脊柱导致背部肌肉紧张,可能就会引起腰酸背痛,这主要是一个生理性的表现怀孕期间运动量太少,体重明显的增加,怀孕的时候身体里面的激素水。

  • qq隐藏图标的方法(操作步骤)

    qq隐藏图标的方法我们打开QQ软件,输入账号密码登录,进入主界面后,点击个人头像,鼠标移到头像上,会出现浮动框,能看到当前使用的应用图标。确定上述操作后,重新查看自己的个人资料,图标已经隐藏成功,操作完以上步骤后,你的QQ好友就看不到你的手机QQ图标了。我们还可以打开QQ,点击最左侧的选项之后选择设置选项,在系统设置中点击登录选项,在主面板中选择在任务栏通知区域显示QQ图标的对勾去掉即可。