dynamic_cast 与 typeid
C++中的类型转换分为两种:
- 隐式类型转换;
- 显式类型转换。
隐式类型转换一般都是不经意间就发生了,比如int + float 时,int就被隐式的转换为float类型了。
显示类型转换包括四种方式:dynamic_cast、static_cast、const_cast、reinterpret_cast
static_cast
static_cast的转换格式:static_cast <type-id> (expression)
将expression转换为type-id类型,主要用于非多态类型之间的转换,不提供运行时的检查来确保转换的安全性。主要在以下几种场合中使用:
- 用于类层次结构中,基类和子类之间指针和引用的转换;
当进行上行转换,也就是把子类的指针或引用转换成父类表示,这种转换是安全的;
当进行下行转换,也就是把父类的指针或引用转换成子类表示,这种转换是不安全的,也需要程序员来保证; - 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum等等,这种转换的安全性需要程序员来保证;
- 把void指针转换成目标类型的指针,是及其不安全的;
注:static_cast不能转换掉expression的const、volatile和__unaligned属性。
dynamic_cast
dynamic_cast的转换格式:dynamic_cast <type-id> (expression)
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
在多态类型之间的转换主要使用dynamic_cast,因为类型提供了运行时信息。
const_cast
const_cast的转换格式:const_cast <type-id> (expression)
const_cast用来将类型的const、volatile和__unaligned属性移除。常量指针被转换成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然引用原来的对象。
reinterpret_cast
reinterpret_cast的转换格式:reinterpret_cast <type-id> (expression)
允许将任何指针类型转换为其它的指针类型;它主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针,在实际开发中,先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原来的指针值;特别是开辟了系统全局的内存空间,需要在多个应用程序之间使用时,需要彼此共享,传递这个内存空间的指针时,就可以将指针转换成整数值,得到以后,再将整数值转换成指针,进行对应的操作。
#include <iostream>
#include <cstdio>
#include <string>
#include <typeinfo> using namespace std; class base{
public:
virtual void funcA(){
cout<<"base"<<endl;
}
}; class derived: public base{
public:
virtual void funcB(){
cout<<"derived"<<endl;
}
}; void funcC(base *p)
{
//dynamic_cast会检查p里面是否真存有派生类derived类型的指针,如果存在那么返回该类型的指针,否则返回NULL
derived* dp = dynamic_cast<derived*>(p);
if(dp){
dp -> funcB();
}else{
p -> funcA();
}
} void funcD(base *p)
{
derived *dp = NULL;
if(typeid(*p) == typeid(derived)){
dp = static_cast<derived*>(p);
dp -> funcB();
}else{
p -> funcA();
}
} int main()
{
base *cp = new derived();
cout<<typeid(cp).name()<<endl;//base
cout<<typeid(*cp).name()<<endl;//derived
funcD(cp);//derived
funcC(cp);//derived
base *dp = new base();
funcC(dp);//base
funcD(dp);//base
return ;
}
最新文章
- python学习笔记4-正则表达式
- 通过js获取cookie的实例及简单分析
- WPF自定义窗口基类
- 《C++ primer》--第9章
- MySQL EER反向建表
- .NET中 类型,对象,线程栈,托管堆在运行时的关系
- 2016-12-30 PHP JS
- BZOJ3223/洛谷P3391 - 文艺平衡树
- Intellij-Idea Maven SSH项目的搭建
- 关于dropout的有趣的进化论解释
- yolov3和darknet opencv版编译安装及基本测试
- python pexpect包的一些用法
- 表id关联数据获取至页面,制作下拉框多选进行数据多项获取(字段处理)
- cookie工具包
- CF 672D Robin Hood(二分答案)
- 租酥雨的NOIP2018赛前日记
- 【Linux笔记】在后台执行scp,实现服务器间无密码文件拷贝。
- NOIP2017 游记
- python学习(24) 使用Xpath解析并抓取美女图片
- 【javascript】点击复制内容的实现