C++ dynamic_cast 的使用
C++中的dynamic_cast 执行运行时刻类型转换,起作用有点类似于Java当中的instance of
reference:http://www.cnblogs.com/chio/archive/2007/07/18/822389.html
它的特点可以执行运行时刻类型检查,从而更加安全;另一方面还有一些小trick,可以弥补virtual虚函数无法解决的问题。下面的例子详细说明这个问题。
class base{
public:
int data;
virtual void fun();
} class derivative: public base{
public:
int data;
void fun();
}
类库的生产商提供了上面的代码实现,提供的方式是头文件和lib,没有源码文件。但是这是我们想对derivative类进行扩充,增加fun2()函数,由于我们没有源码,因此无法修改。这时使用dynamic_cast可以做到。
具体办法是:
step 1: 在derivative的头文件当中添加void fun2()的声明
step 2: 在任意一个源文件当中实现该方法
void derivative::fun2(){
//do something
}
在调用时使用下面的方式来加以调用
int main(){
Base * b = new Derivative();
Derivative * d =dynamic_cast<Derivative>(b);
if(d){
// 转换成功,并且此时derivative类型的指针d,可以使用扩充的方法
}else{
// 转化没有成功,则没有扩充的方法
}
}
C++ 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 ...
随机推荐
- jenkins自定义安装目录
jenkins默认会安装到jvm环境变量的user.dir目录下,这样在系统重新安装后容易丢失. 将以下文件保存为start.bat放到jekins.jar同一目录,执行start.bat即可将jek ...
- 手机端适配iPhoneX
iPhoneX取消了物理按键,改成底部小黑条,这一改动导致网页出现比较尴尬的屏幕适配问题.对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理,所以我们只需要关注底部与小黑条的适配问题即可(即常 ...
- git 远程仓库与本地项目关联
在git 中创建一个项目或仓库如起名blog,生成README.md文件,在本地创建一个项目名为blog ,blog里面是代码,此时执行 git remote add origin <ssh协 ...
- iOS.CocoaPods.0
1. CocoaPods CocoaPods 是Objective-C (iOS and OS X) projects 的依赖管理器. A CocoaPod (singular) is a speci ...
- Node.js v7.4.0 Documentation Addons
https://nodejs.org/docs/latest/api/addons.html Node.js Addons are dynamically-linked shared objects, ...
- 大牛的距离(笑cry)精简算法
在一条数轴上有N头牛在不同的位置上,每头牛都计算到其它各头牛的距离.求这n*(n-1)个距离的总和.1<= N <= 10000.每头牛所在位置是一个范围在0到1,000,000,000之 ...
- Eclipse生成部署描述符(web.xml)
右键点击你的web项目名--->Java EE Tools-->Generate Deployment Descriptor Stub 要想自动生成,只需在创建web项目时,把最后一页的 ...
- Eclipse的下载及安装
Eclipse的下载地址: https://www.eclipse.org/downloads/ 下载完成后,双击安装包即可安装 选择 Eclipse IDE for Java EE Decelope ...
- JDK 规范目录
JDK 规范目录 1.1 Java 异常处理 2.1 JDK 之 NIO 2 WatchService.WatchKey(监控文件变化) https://mp.weixin.qq.com/s/NIn2 ...
- vue ui之 iview 事件拦截
用过easyui的,应该清楚easyui组件有很多before事件拦截,有时候会特别重要. 最近在研究vue的ui组件iview虽然功能也不错,感觉还是没有像easyui那样强大,就比如before事 ...