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

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++》

    推荐阅读
  • 白菜炖粉条怎样做好吃(白菜炖粉条的做法)

    接下来我们就一起去了解一下吧!白菜炖粉条怎样做好吃原料:带皮五花猪肉500克,粉条100克,大白菜叶250克,香菜10克,食油、酱油、绍酒、白糖、精盐、味精、花椒、大料、桂皮、葱段、姜片各适量。

  • 怎么改qq预设账号数量(qq预设账号怎么增加)

    qq预设账号数量限制为7个,预设账号数量达到上限只能删除几个账号,然后再添加。

  • 武汉免费景点预约国庆门票什么时候开始?几号可以约?

    2020十一国庆武汉哪里好玩?武汉十一好玩的活动又有哪些?国庆旅游门票免费预约什么时候开始?怎么预约?看这里!

  • 90年代最受欢迎的经典歌曲(影响一代人成长的7首经典歌曲)

    《无地自容》—黑豹乐队《无地自容》是中国著名摇滚乐队黑豹乐队的音乐作品之一。它收录在黑豹乐队于1991年发行的首张专辑《黑豹》内。几多调侃,几多无奈,跃然纸上。其后先后被众多华语歌手翻唱,其中以邓丽君和蔡琴的版本最为著名。这首歌曲是伍佰的代表作之一。曾被庾澄庆,伍佰,林忆莲,王菲,梁静茹,周华健,迪克牛仔,高胜美等歌手翻唱过,一时间风靡大街小巷,是国语歌曲上的又一里程碑。

  • 盐菜肉怎么做好吃(如何做盐菜肉)

    如何做盐菜肉准备五花肉300g、盐菜200g、油20g、葱姜20g、酱油20g、花椒、盐、糖、鸡精各10g葱姜切片备用,起锅烧水,放入葱姜、花椒、糖、酱油、盐、鸡精将五花肉煮熟捞出,将煮好的五花肉皮朝下放入油锅中。

  • 红蝎子演员表名单(红蝎子之带泪梨花中的女演员)

    司光敏在《红蝎子之带泪梨花》中饰柳佳佳。

  • 在风水中围墙的高矮有什么禁忌(在风水中围墙的高矮有啥禁忌)

    左面大则会婚姻不顺,右面大则居者多病灾。不宜在围墙上开窗,古称“朱雀开口”,易失去防护意义,易惹是生非,造成不良事端。若先建围墙后建宅,则容易客克主,不但建筑易遭波折,完工迟缓,而且居者家道必定难以兴旺发达。住宅阴气过重,会使居者招惹官非口舌和病痛。住宅的四周围墙包括住宅的大门,要保持完整,不可缺崩,否则会有官非、口舌、病灾等灾难。

  • 比权游更火爆的剧(不仅是权游完结)

    不仅是权游完结2019是众多神剧的完结年从这个月开始,你就会和许多「心头好」说再见了今天的主题就是:说一说说完结的剧——即将完结的剧集(北京时间)《副总统》第七季最后一集播出时间;5月13日《权力的游戏》第八季最后。

  • 昆虫记作者简介(昆虫记作者个人简介)

    接下来我们就一起去了解一下吧!昆虫记作者简介昆虫记作者:让-亨利·卡西米尔·法布尔。让-亨利·卡西米尔·法布尔,法国著名的昆虫学家、文学家。被世人称为“昆虫界的荷马”“昆虫界的维吉尔”。他用水彩绘画的700多幅真菌图,深受普罗旺斯诗人米斯特拉尔的赞赏及喜爱。他也为漂染业做出贡献,曾获得三项有关茜素的专利权。

  • 21岁女孩一周七次“857”,被医生发现肠道“破烂不堪”

    拿到检查结果的时候,小雅万分震惊,她怎么样不敢相信,她正是花样年华,身体却走到了尽头。原来小雅最近几年正过着“857”的生活,相信大家都不知道什么是857。小雅正是这类人群,每天身着妖艳,浓妆艳抹,艳遇有钱人,过上了纸醉金迷的生活,虽然小雅赚了不少钱,可她这样的生活等于慢性自杀。像小雅这种情况也不是个别了,据医生介绍,像她这种情况的病人一天能接待好几个。医生直言:铁打的身体,也受不了一周七次的857。