关于dynamic_cast
http://www.groad.net/bbs/read.php?tid-5476.html
dynamic_cast 进行运行时强制转换。如果在执行时转换非法,则会转换失败。dynamic_cast 的通用形式如下:
dynamic_cast <target-type> (expr)
其中 target-type 指定了强制转换的目标类型,expr 是需要进行强制转换的表达式。
目标类型必须是指针类型或引用类型,也就是说,表达式也必须能够被求值为指针类型或者引用类型的结果。
dynamic_cast 主要被用来执行多态类型之间的强制转换。比如两个多态类 B 和 D,且 D 派生于 B,此时我们可以用 dynamic_cast 将 D* 指针类型转换为 B* 类型,这是因为基类型的指针通常可以指向派生类的对象。然而,只有当指针指向的对象确实是类 D 的对象时,dynamic_cast 才能将指针从类型 D* 转换为类型 B* 。
如果转换指针的类型失败时,经过 dynamic_cast 运算后得到的指针为空值。
如果转换引用的类型失败时,则会抛出 bad_cast 类型异常。
下面示例中,假设 Base 是多态类,Derived 派生于 Base ,那么:
|
1
2
3
4
5
6
|
Base *bp, b_ob;Derived *dp, d_ob;bp = &d_ob; // 基类型的指针可以指向派生类的对象dp = dynamic_cast<Derived *> (bp); //强制转换基类指针为派生类指针,做法正确 |
上面,将基类指针 bp 强制转换为派生类指针 dp 是可以的,这是因为 bp 指向的对象确实是一个 Derived 类型的对象。
下面的是强制转换失败的示例:
|
1
2
|
bp = &b_ob;dp = dynamic_cast<Derived *>(bp); //错误 |
现在 bp 是一个指向基类对象的指针,这时不能 dynamic_cast 将其强制转换为派生类对象的指针,因为派生类对象的指针不能指向基类的对象。
下面是代码测试多种 dynamic_cast 的情况:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
// dynamicast.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;class Base {public: virtual void f() { cout << "Inside Base.\n"; }};class Derived : public Base {public: void f() { cout << "Inside Derived\n"; }};int _tmain(int argc, _TCHAR* argv[]){ Base *bp, b_ob; Derived *dp, d_ob; dp = dynamic_cast<Derived *>(&d_ob); //派生类对象的指针强制转换为派生类对象的指针 OK if (dp) { cout << "Cast from Derived * to Derived * OK.\n"; dp->f(); } else cout << "Error\n"; cout << endl; bp = dynamic_cast<Base *>(&d_ob); //派生类对象的指针强制转换为基类的指针 OK(基类指针可以指向派生类的对象) if (bp) { cout << "Cast from Derived * to Base * OK.\n"; bp->f(); } else cout << "Error\n"; cout << endl; bp = dynamic_cast<Base *>(&b_ob); //基类的指针强制转换为基类的指针 OK if (bp) { cout << "Cast from Base * to Base * OK.\n"; bp->f(); } else cout << "Error\n"; cout << endl; dp = dynamic_cast<Derived *>(&b_ob); //基类对象的指针(地址)强制转换为派生类的指针(失败) if(dp) cout << "Error\n"; else cout << "Cast from Base * to Derived * not OK.\n"; cout << endl; bp = &d_ob; //bp 指向派生类的对象 dp = dynamic_cast<Derived *> (bp); //可以,因为 bp 确实已经指向了派生类 if(dp) { cout << "Casting bp to Derived * OK\n" << "because bp is really pointing\n" << "to a Derived object.\n"; dp->f(); }else cout << "Error\n"; cout << endl; bp = &b_ob; //bp 指向基类型对象 dp = dynamic_cast<Derived *> (bp); //失败,因为 bp 现在已经确实指向了基类对象 if(dp) cout << "Error"; else { cout << "Now casting bp to a Derived *\n" << "is not OK because bp is really \n" << "pointing to a Base object.\n"; } cout << endl; dp = &d_ob; //dp 指向派生类对象 bp = dynamic_cast<Base *> (dp); //可以,基类指针可以指向派生类对象 if (bp) { cout << "Casting dp to a Base * is OK.\n"; bp->f(); }else cout << "Error\n"; return 0;} |
运行输出:
Cast from Derived * to Derived * OK.
Inside DerivedCast from Derived * to Base * OK.
Inside DerivedCast from Base * to Base * OK.
Inside Base.Cast from Base * to Derived * not OK.
Casting bp to Derived * OK
because bp is really pointing
to a Derived object.
Inside DerivedNow casting bp to a Derived *
is not OK because bp is really
pointing to a Base object.Casting dp to a Base * is OK.
Inside Derived
关于dynamic_cast的更多相关文章
- RTTI: dynamic_cast typeid
dynamic_cast:将基类类型的指针向派生类指针安全转换.多用于下行转换.上行转换时,和static_cast是一样的.C++类型转换看这里.而const_cast用来修改类型的const或vo ...
- c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast
c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast [版权声明]转载请注明出处 http://www.cnblogs.c ...
- C++ dynamic_cast对指针类型的转换
C8-3 三角形还是长方形? (100.0/100 points) 题目描述 在多态概念中,基类的指针既可以指向基类的对象,又可以指向派生类的对象.我们可以使用dynamic_cast类型转换操作符来 ...
- dynamic_cast 和 static_cast 隐式类型转换的区别
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...
- C++ 中dynamic_cast<>的使用方法小结 -判断类型-rtti
将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理 即会作一定的判断. 对指针进行dynamic ...
- C++强制类型转换操作符 dynamic_cast
dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用. >>>>>>>>>>>编译器的RTTI设 ...
- static_cast、dynamic_cast、reinterpret_cast、const_cast以及C强制类型转换的区别
static_cast 1. 基础类型之间互转.如:float转成int.int转成unsigned int等 2. 指针与void*之间互转.如:float*转成void*.CBase*转成void ...
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
c++强制类型转换:dynamic_cast.const_cast .static_cast.reinterpret_cast 博客分类: C/C++ CC++C#编程数据结构 dynamic_ca ...
- static_cast dynamic_cast const_cast reinterpret_cast总结对比
[本文链接] http://www.cnblogs.com/hellogiser/p/static_cast-dynamic_cast-const_cast-reinterpret_cast.html ...
- static_cast, dynamic_cast, const_cast
http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1 ...
随机推荐
- System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本
说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.ServiceModel.FaultEx ...
- Stanford parser学习:LexicalizedParser类分析
上次(http://www.cnblogs.com/stGeekpower/p/3457746.html)主要是对应于javadoc写了下LexicalizedParser类main函数的功能,这次看 ...
- asp.net图片上传实例
网站后台都需要有上传图片的功能,下面的例子就是实现有关图片上传. 缺点:图片上传到本服务器上,不适合大量图片上传. 第一.图片上传,代码如下: xxx.aspx 复制代码代码如下: <td cl ...
- PHP中strtotime函数使用方法分享
在PHP中有个叫做strtotime的函数.strtotime 实现功能:获取某个日期的时间戳,或获取某个时间的时间戳.strtotime 将任何英文文本的日期时间描述解析为Unix时间戳[将系统时间 ...
- php中json_encode中文编码问题分析
众所周知使用json_encode可以方便快捷地将对象进行json编码,但是如果对象的属性中存在着中文,问题也就随之而来了.json_encode会将中文转换为unicode编码例如:'胥'经过jso ...
- php 获取数组第一个值的方法分享
以下是对使用php实现获取数组第一个值的方法进行了详细的分析介绍,需要的朋友可以过来参考下 reset (PHP 3, PHP 4, PHP 5)reset -- 将数组的内部指针指向第一个单元 说明 ...
- css透明(支持各浏览器)
opacity: 0.4;filter: progid:DXImageTransform.Microsoft.Alpha(opacity=40); -ms-filter: "progid:D ...
- c# this.location和e.X的区别
this.location是窗口当前位置 e.X是具体事件的相对坐标 size是窗口尺寸宽和高
- [分享] Code::Blocks Windows Console 中文亂碼解決
相信各位大大們應該都有聽過Code::Blocks這個IDE,但網路上有許多人反應Code::Blocks不能編出中文的Console程式,但 Code::Blocks最新的版本預設使用UTF-8做為 ...
- iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):2 H264数据写入文件
本文档为iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):1 概述续篇,主要描述: CMSampleBufferRef读取实际数据 序列参数集(Sequence Para ...