C++中的类型转换分为两种:

  1. 隐式类型转换;
  2. 显式类型转换。

  隐式类型转换一般都是不经意间就发生了,比如int + float 时,int就被隐式的转换为float类型了。

  显示类型转换包括四种方式:dynamic_cast、static_cast、const_cast、reinterpret_cast

 static_cast

  static_cast的转换格式:static_cast <type-id> (expression)

  将expression转换为type-id类型,主要用于非多态类型之间的转换,不提供运行时的检查来确保转换的安全性。主要在以下几种场合中使用:

  1. 用于类层次结构中,基类和子类之间指针和引用的转换;
    当进行上行转换,也就是把子类的指针或引用转换成父类表示,这种转换是安全的;
    当进行下行转换,也就是把父类的指针或引用转换成子类表示,这种转换是不安全的,也需要程序员来保证;
  2. 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum等等,这种转换的安全性需要程序员来保证;
  3. 把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 ;
}

dynamic_cast 与 typeid的更多相关文章

  1. 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml

    一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...

  2. RTTI、dynamic_cast、typeid、类与类之间的关系uml

    一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...

  3. C++运行时类型判断dynamic_cast和typeid

    dynamic_cast dynamic_cast < Type-id > ( expression ) dynamic_cast<类型>(变量) 在运行期间检测类型转换是否安 ...

  4. dynamic_cast和typeid

    1. C++有三个支持RTTI的元素. 如果可能的话,dynamic_cast运算符将使用一个指向基类的指针来生成一个指向派生类的指针,否则,该运算符返回0--空指针. typeid运算符返回一个对t ...

  5. typeid详解(转)

    (http://www.cppblog.com/smagle/archive/2010/05/14/115286.html) 在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time ...

  6. typeid详解

    在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time Type Identification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“ ...

  7. C++中的类型判断typeid()操作与java中的 instanceof 做比较

    这是RTTI(运行阶段类型识别)的问题,c++有三个支持RTTI的元素: 1. dynamic_cast 操作符     如果可能的话,dynamic_cast操作符将使用一个指向基类的指针来生成一个 ...

  8. 【转】gdb typeid 详解

        在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time Type Identification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型, ...

  9. 15个C++项目列表

    实验楼上有很多C++的实战项目,从简单到进阶,学习每个项目都可以掌握相应的知识点. 如果你还是C++新手的话,那么这个C++的项目列表你可以拿去练手实战开发,毕竟学编程动手实践是少不了的! 如果你不知 ...

随机推荐

  1. Django-前后台的数据交互

    Django 从后台往前台传递数据时有多种方法可以实现. 最简单的后台是这样的: from django.shortcuts import render def main_page(request): ...

  2. 【02】bootstrap起步

    起步 简要介绍 Bootstrap,以及如何下载.使用,还有基本模版和案例,等等. 下载 Bootstrap (当前版本 v3.3.5)提供以下几种方式帮你快速上手,每一种方式针对具有不同技能等级的开 ...

  3. scrapy的User-Agent中间件、代理IP中间件、cookies设置、多个爬虫自定义settings设置

    在scrapy的反爬中,常用的几个配置,简单总结了下: User-Agent中间件: from fake_useragent import UserAgent class RandomUserAgen ...

  4. Win32编程API 基础篇 -- 6.菜单和图标

    菜单和按钮 例子:菜单1 本小节仅仅向你展示如果向你的窗口中加入一个基本的菜单,通常你会用到一个提前制作好的菜单资源,这会是一份.rc文件并且会被编译链接进你的.exe可执行程序中.这是具体的流程做法 ...

  5. D - Doing Homework 状态压缩 DP

    Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every ...

  6. Java数据库连接池研究

    一.背景 连接池简介: 连接池初始化时创建一定数量的连接,然后从连接池中重用连接,而不是每次创建一个新的. 数据库连接是一种关键的.有限的.昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对 ...

  7. gn3 --iou

    http://www.wyzc.com/Course/Course/learnAction/id/14049/center/0#lesson/400847 http://www.mamicode.co ...

  8. delphi不同版本字符串类型的演化

    string,DELPHI2009以前的版本string=ansistring,一个字符占一个字节,DELPHI2009及以上版本string=unicodestring,一个字符占二个字节. cha ...

  9. Python: 解决simple-db-migrate的"No module named 'MySQLdb'错误

    sudo apt-get install libmysqlclient-dev sudo -H pip3 install mysqlclient

  10. 解决安装OpenShift Client Tools时提示的dl/import (LoadError)问题

    安装成功Ruby和git以后.执行rhc setup时提演示样例如以下错误: C:/Ruby22-x64/lib/ruby/2.2.0/rubygems/core_ext/kernel_require ...