dynamic_cast动态类型强制转换 dynamic cast 实现

用法:dynamic_cast <type-id > ( expression )   

该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;  

如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。  

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。  在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;   

在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

   class B

dynamic_cast动态类型强制转换 dynamic cast 实现

{

  public:   

int m_iNum;   

virtualvoid foo();  

};

  class D:public B

{

  public:   

char *m_szName[100];

  };

  void func(B *pb)

{

  D *pd1 = static_cast<D *>(pb);  

D *pd2 = dynamic_cast<D*>(pb);  

 }  

在上面的代码段中,如果pb指向一个D类型的对象(中的属于B的那部分空间,因为D是B的派生类,所以D的实体空间比较大,其中一部分实体空间属于B),pd1和pd2是一样的,并且对这两个指针执行D类型的任何操作都是安全的;  

但是,如果pb仅仅指向的是一个B类型的对象,那么pd1返回的仍然是一个指向该对象的指针,对它进行D类型的操作将是不安全的(如访问m_szName), 

 而pd2将是一个空指针。  

 另外要注意:B要有虚函数,否则会编译出错;static_cast则没有这个限制。   

这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<Insidec++ object model>)中,只有定义了虚函数的类才有虚函数表,  没有定义虚函数的类是没有虚函数表的。

  另外,dynamic_cast还支持交叉转换(crosscast)。如下代码所示。

  class A

{

  public:   

int m_iNu m;   

virtual void f(){} 

 };

  class B:public A

{

  };

  class D:public A

{

  };

  void f()

{

  B *pb = new B;   

pb->m_iNum = 100;  

D *pd1 = static_cast<D *>(pb);//compile error   

D *pd2 = dynamic_cast<D *>(pb); //pd2is NULL   

delete pb;   

}  

 在函数f()中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用dynamic_cast的转换则是允许的,结果是空指针。

  

爱华网本文地址 » http://www.aihuau.com/a/25101015/243618.html

更多阅读

pdf转换器怎么用 pdf转换成word

?  很多pdf转换成word转换器在实现pdf和word两者之间的转换的时候,对于pdf文件之内的图片、文字样式、超链接等一系列的内容的识别能力都并不完美。一般来说,转换能力较差的转换器软件转换之后,在word文件之内经常会出现各种排版上

怎样把视频转换成MP4格式 qlv格式怎样转换成mp4

随着手机、MP4等移动终端的流行,MP4视频格式应运而生。由于手机、MP4、iPod、iPhone、PSP、iPad等移动终端对能兼容的视频格式有严格要求,因此要在各大移动终端观看电影视频,对导入的视频就要严格把关,否则轻则播放不流畅,影响观赏效果,重

MTS格式转换完美方案 mts格式转换

MTS是sony等高清摄像机拍摄的视频格式,因为数码摄像机在普通家庭中普及而越加流行,其通常采用了AVC高清编码,特点是具有高画质,但体积庞大,且兼容性较传统格式低。因为这样的原因,我们常常需要进行MTS格式转换,目的是为了降低体积,或是兼容

解析路由器上的DHCP服务器是什么 dhcp服务器是什么

路由器设置中的dhcp是什么? 需要保持着启动状态吗?  动态主机设置协议(Dynamic Host Configuration Protocol, DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址给用户给内部

C#变长数组二 c 数组长度 变量

首先声明,这不是我写的,只是我看对你有用才贴上来的1、什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素实现了IColle

声明:《dynamic_cast动态类型强制转换 dynamic cast 实现》为网友指尖上的风景分享!如侵犯到您的合法权益请联系我们删除