dynamic_cast static _cast

转载 2018年04月16日 16:11:55

       转自https://blog.csdn.net/fyyyr/article/details/79217808

 A为基类,B为派生类。现在定义:

 

  1. A*   pA;  
  2.   
  3. B*   pB; 

一般来说,pB可以转换为pA,(把派生类的指针或引用转换成基类表示),称之为上行转换。

但反之一般是不行的,也就是将pA转换为pB,(把基类指针或引用转换成派生类表示),称之为下行转换。这种行为直接用(*类名)的方式来进行是错误的。

然而,下行转换并非绝对不可以。要进行下行转换,需要用到两个关键字:dynamic_caststatic_cast

1.    关键字static_cast比较简单。

格式为:static_cast < type-id> ( expression )

这样就会将expression转换为type-id类型。

注意type-id必须是指针或引用,并且expression要与type-id类型保持一致(都是指针或都是引用)。

但是static_cast关键字是不会进行运行时类型检查的。所以static_cast进行上行转换是安全的,但是进行下行转换是不安全的。

2.     关键字dynamic_cast

格式为:dynamic_cast < type-id> (expression)

这样就会将expression转换为type-id类型。

注意type-id必须是指针或引用,并且expression要与type-id类型保持一致(都是指针或都是引用)

dynamic_cast关键字会进行运行时类型检查。所以dynamic_cast进行上行转换以及下行转换都是安全的。

但是,使用dynamic_cast有一个必要条件就是基类A中必须存在虚函数。而static_cast无此限制。其原因是:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。

①     dynamic_cast支持交叉转换

基类A有两个直接派生类B、C。

那么,将B* pB转换为C* pC,这种由派生类B转换到派生类C的转换称之为交叉转换。

这种情况下只能使用dynamic_cast

②     dynamic_cast支持多继承

设有两个基类A1、A2,派生类B从A1、A2中派生。

那么,将pB转换为pA1或是pA2,此时只能使用dynamic_caststatic_cast是无法实现此功能的。

即:单继承情况下,dynamic_caststatic _cast效果是相同的;多继承情况下,只能使用dynamic_cast

static_cast与dynamic_cast的比较

最近一直在琢磨类型转换的问题,索性追究到底了。仍然是前面提到的继承结构:base1、base2、derived,但是base1和derived有同名的、非虚函数,我的目的是:使用子类的对象,调用基类的...
  • boluo1982107
  • boluo1982107
  • 2008-11-06 17:55:00
  • 14484

C++ static_cast和dynamic_cast的区别

网上也看到了一些相关的总结,总觉得他们总结的不太好,还是按照自己的理解写一写吧。 C语言类型转换:           C语言提供了隐式转换,显示转换。通过这两种方式,C语言中大部分的类型...
  • u010122607
  • u010122607
  • 2015-10-26 11:32:34
  • 904

C++中static_cast和dynamic_cast强制类型转换

前言 说起C++中的继承、多态、虚函数等概念,可能很多同学都有所了解,但是要说真正熟知的同学可能就不是很多了。最近在编程过程中了解到C++类型的层次转换(这就涉及到了多态和继承的相关概率),通常C语言...
  • qq_26849233
  • qq_26849233
  • 2017-03-15 11:45:10
  • 11964

由static_cast和dynamic_cast到C++对象占用内存的分析

static_cast和dynamic_cast是C++的类型转换操作符。编译器隐式执行的任何类型转换都可以由static_cast显式完成,即父类和子类之间也可以利用static_cast进行转换。...
  • keheinash
  • keheinash
  • 2016-07-27 21:07:55
  • 880

C++的RTTI和dynamic_cast效率问题

在网上经常看到有人说,dynamic_cast的效率问题.当然因为它是运行 时的cast,开销必然少不了. 对于down cast,可以用static_cast代替,只不过不太安全. 对于钻石结构...
  • debugconsole
  • debugconsole
  • 2013-07-19 13:56:13
  • 5674

static_cast,const_cast,dynamic_cast, reinterpret_cast四种类型转换区别

一 C风格显式转换和函数风格式转换     在C++中有些数据类型的转换是可以直接转换的,这种称为隐式转换。例如: double a = 12.0; int b = a;但有时编译器对于一些数据精度...
  • hhhhh2333
  • hhhhh2333
  • 2016-11-19 01:55:01
  • 465

C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用

C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用
  • fengbingchun
  • fengbingchun
  • 2016-04-24 20:36:05
  • 10726

C++ qt dynamic_cast const_cast static_cast类型转换

dynamic_cast:   通常在基类和派生类之间转换时使用,run-time   cast const_cast:   主要针对const和volatile的转换.  static_cast...
  • qq61394323
  • qq61394323
  • 2013-12-10 20:35:00
  • 5738

编程学习笔记之c++相关::dynamic_cast介绍

      前端时间我写了一篇有关typeid的博客,在通常情况下,跟随typeid出生入死的,还有一个叫dynamic_cast的好基友,本来它也应该紧随typeid之后一起写出来的,但因家中琐事绵...
  • wenpinglaoyao
  • wenpinglaoyao
  • 2016-01-11 15:11:49
  • 2770

dynamic_cast彻底明白了~

dynamic_cast ( expression) 该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*; 如果type-id是类指针...
  • hongkangwl
  • hongkangwl
  • 2014-03-13 12:56:55
  • 2370
收藏助手
不良信息举报
您举报文章:dynamic_cast static _cast
举报原因:
原因补充:

(最多只允许输入30个字)