dynamic_cast?dynamic_cast的用法
亲爱的读者们,你是否对dynamic_cast和dynamic_cast的用法的关系感到好奇?在本文中,我将深入探讨它们之间的联系,让你对此有更深刻的理解。
谁能说明C++的static_cast的实现原理,奖励50分
static_cast< type-id>( expression)
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
dynamic_cast< type-id>( expression)
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。
reinterpret_cast
是C++里的强制类型转换符。操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。因此,需要谨慎使用 reinterpret_cast,这是所有映射中最危险的,但它是无损转换
const_cast<type_id>(expression)
该运算符用来修改类型的const或volatile属性。除了const或volatile修饰之外, type_id和expression的类型是一样的。
一、常量指针被转化成非常量指针,并且仍然指向原来的对象;
二、常量引用被转换成非常量引用,并且仍然指向原来的对象;
三、常量对象被转换成非常量对象。
说通俗一点就是把常量当成变量使用
C++中 dynamic_cast转换的是数据类型还是指向的数据类型
father*p= new father;
dynamic_cast<son*>(p);
这个结果是NULL,这点楼上的解释的很清楚啊。
(画图水平有限了,略丑,莫怪,o(╯□╰)o)
你看一下上图,如果你用father*p= new father;那么你只新建了S1的空间,但是son的存储空间是S3的大小,有S2大小的存储空间你根本就没有创建,就算你用了dynamic_cast<son*>(p);来转化指针,但是因为p原本的空间大小根本就没有S2这一半的存在,所以这里会转化失败,返回NULL。
但是你如果是father*p= newson;这里你新建了S3大小的空间,也就是S1和S2都新建了,但是在因为这时候p是father类型指针,所以这时候p最多的范围是S1大小内存储的东西,虽然你不能使用S2的内容,但是它(S2)毕竟是真实存在的,所以可以用dynamic_cast<son*>(p);来转化成son的指针,这时候就可以指向S3内的全部了。
dynamic_cast 与static_cast的区别
一个动态转换,一个是静态转换。一般情况下使用static_case<类型>
就可以了。
同时,这个只有在高版本的C++编译器中才能识别。
dynamic_cast是试探映射,如dynamic_cast<A>*pB意思是“我希望它是A*,并打算要求它是”。它通常被称为类层次的动态导航。
而static_cast通常可用于类层次的静态导航,无映射变换,窄化变换(会丢失信息)等等,static_cast的应用要广一些,但如前所提到的,在类层次导航变换中我们应该使用前者,因为后者static_cast可能意味着冒险(比如变换时类似于强制转换一样丢失信息)。但是在一个类层次中没有虚函数或者我们确定有其他允许我们安全向下映射的信息则后者static_cast更快一些。
dynamic_cast的用法
dynamic_cast<type-id>(expression)
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;
如果 type-id是类指针类型,那么expression也必须是一个指针,如果 type-id是一个引用,那么 expression也必须是一个引用。
dynamic_cast运算符可以在执行期决定真正的类型。如果 downcast是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果 downcast不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。 classB{public:intm_iNum;virtualvoidfoo();};classD:publicB{public:char*m_szName[100];};voidfunc(B*pb){D*pd1=static_cast<D*>(pb);D*pd2=dynamic_cast<D*>(pb);}在上面的代码段中,如果 pb指向一个 D类型的对象,pd1和 pd2是一样的,并且对这两个指针执行 D类型的任何操作都是安全的;但是,如果 pb指向的是一个 B类型的对象,那么 pd1将是一个指向该对象的指针,对它进行 D类型的操作将是不安全的(如访问 m_szName),而 pd2将是一个空指针。
另外要注意:B要有虚函数,否则会编译出错;static_cast则没有这个限制。
这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<Inside c++ object model>)中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的。
感谢您花时间阅读本文!我们希望通过对dynamic_cast的问题进行探讨,为您提供了一些有用的见解和解决方案。如果您需要更多帮助或者有其他疑问,请不要犹豫与我们联系。