C++晋升之dynamic_cast

danamic_cast 动态类型转换

----RTTI提供的的操作符

----动态:在运行阶段

----类型转换:检测指针或引用类型,true->转换

----体现价值的地方:用于多态

----假设出现这样的情况:

父类A虚函数aa()指针p,子类B指针p1,无关类C指针p2

你的p1和p2在一起传进函数

函数的功能将传进来的指针强转成A类的,调用函数aa()

C类没有继承A,这样会崩溃

前提:1.C和B里没有专门用来鉴别的成员变量

2.不能让C也继承A

----工作中遇到的问题:

用第三方的软件、库,对方有些没完善你有要用出现上面假设的那种情况

解决:

方法一:前提里的那两个绕圈子的方法

缺点:多了个成员变量或者是多复用了一遍父类

方法二:dynamic_cast<T>(T1)动态强制转换(引出主题了)

用:if( p = dynamic_cast<A*>(p1))

p是父类指针 A是父类 p1是子类指针 TRUE

只能这样写,用VS测出的

注意事项:

1.p 和 A*的位置要对应,p处写的指针是A*处的类的,否则

编译的时候报的错

2.p的位置换成子类指针,A*位置换为子类,后面是父类对象

结果:不报错,是false,和我们想要用动态转换类型的结果要背离

3.父类必须有虚函数,否则

4.子类指针必须new,父类无所谓,否则

5.用VS的时候我没有去打开什么RTTI的选项,其他的编译器有,需要设置里打开

打开RTTI运行效率会低,对于JAVA和C#,不存在这个问题(因为本来就很慢)

6.慎用,移植性低

时间: 2024-07-30 18:58:18

C++晋升之dynamic_cast的相关文章

C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2 c++除了能使用c语言的强制类型转换外,还新增了四种强制类型转换:static_cast.dynamic_cast.const_cast.reinterpret_cast,主要运用于继承关系类间的强制转化,语法为: static_cast<new_type> (expression) dynam

C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast(dynamic_cast还支持交叉转换,const_cast将一个类的const、volatile以及__unaligned属性去掉)

在C++中,存在类型转换,通常意味着存在缺陷(并非绝对).所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换(3)避免使用reinterpret_cast和老式的强制类型转换操作符通常,隐式的类型转换会导致警告,需要重视这些警告,并使用显式的类型转换代替,例如static_cast代替一些算术类型转换. 在C++中,对象的类型通常有如下几种:(一)内置类型,如int ,bool ,枚举类型等(二)自定义类型

鸡汤 - 晋升的为什么不是你(转)

2011年底的时候,在网上看了一篇文章,<能让你少奋斗10年的工作经验>,其中大部分条目与工作态度相关,有实例,可操作,故有此感慨. 职场纵横,如果下面8条,你也符合部分状态,或许,这就是“晋升的为什么不是你”的答案了. 一.心灵停留在舒适区是不可原谅的状态为:1)期望舒适,不愿被打扰,不愿被push,不愿被职责,不愿主动关心别人,不愿思考如何提高团队效率:2)会议上,消极听取领导意见,消极待命,很死的完成交予的任务:3)不主动接触其他同事,聚会不主动发言,没有做好社交的准备:把身边的“随意性

const_cast,static_cast,dynamic_cast,reinterpret_cast的区别

C++继承了C中的隐式和显式转换的方式.但这种转换并不是安全和严格的, 加上C++本身对象模型的复杂性,C++增加了四个显示转换的关键字.(C++是强类型语言) 经过编码测试,小结如下: const_cast:仅用于去掉完全同类型的const,volatile约束,不能含有任何其它类型的转换,若不含约束也可以相当于没转换static_cast:使用类型可在继承的方向上向上或向下转换,不进行安全检查. 子类转父类,值.引用.指针形式均可,其中指针还可以是常量 父类转子类,值不可以,引用和指针均可,

RTTI: dynamic_cast typeid

dynamic_cast:将基类类型的指针向派生类指针安全转换.多用于下行转换.上行转换时,和static_cast是一样的.C++类型转换看这里.下面主要说多态下的RTTI: 使用条件: 基类应有虚函数. 编译器需启用Runtime Type Information/Identification(RTTI),运行时类型信息.VS下在项目属性页下启用,如下,选 是: (VS2013测试:默认的留空不选也能正常使用dynamic_cast) 结果: 对指针进行dynamic_cast,失败返回nu

static_cast, dynamic_cast, const_cast探讨

C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. int ival = 3;double dval = 3.14159;ival + dval;//ival被提升为double类型 2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型 int *pi = 0; // 0被转化为int

C++ 中 dynamic_cast 使用(二)

首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型,这种检查不是语法上的,而是真实情况的检查. 先看RTTI相关部分,通常,许多编译器都是通过vtable找到对象的RTTI信息的,这也就意味着,如果基类没有虚方法,也就无法判断一个基类指针变量所指对象的真实类型, 这时候,dynamic_cast只能用来做安全的转换,例如从派生类指针转换成基类指针.而这种转换其实并不需要dynamic_cast参

[转]C++的类型转换符:static_cast、const_case、dynamic_cast

dynamic_cast:通常在基类和派生类之间转换,使用到RTTI(Runtime Type Information)在运行时判断转换是否正确,如不正确将抛出异常. const_cast:主要针对const和volatile的转换.   static_cast:一般用于基本数据类型之间的转换转换,no run-time check,编译时判断. reinterpret_cast:用于进行没有任何关联类型之间的转换,比如一个字符指针转换为一个整形数. C++通过引进四个新的类型转换操作符克服了C

《Google想出了一个决定人员晋升的算法,然后就没有然后了......》有感

Prasad Setty 是 Google People Analytics 团队的副总裁.7 年前 Google 成立的这支团队的职责是收集和利用数据来支撑公司的管理实践.其使命很简单,即基于数据和分析做出所有的人事决定.在今年 10 月举行的Google re:Work大会上,Setty 介绍了这支团队用科学来进行人力资源管理的一些做法.其结论是:      算法虽好,可不能滥用,人事决定终归要有人来决定.?Google 是一个由工程师成立的公司,目前也仍然由工程师统治.这家成千上万的大公司