/*这是从网上摘下的样例,主要讲述了 dynamic_cast<> 的用法。*/

/*

作用:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会依据基类指针是否真正指向继承类指针来做对应处理,

       即会作一定的推断。

       对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针;

       对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。

 

注意:dynamic_cast在将父类cast到子类时,父类必需要有虚函数。比如在以下的代码中将CBasic类中的test函数不定义成

       virtual时,编译器会报错:error C2683: dynamic_cast : “CBasic”不是多态类型

 

对编译器的要求:

       dynamic_cast<> 会用到RTTI技术,因此须要启动“执行时类型信息”这一选项,而在VC.net 2003中默认是关闭的。

       所以须要人为的启动这一选项。否则编译器会报以下的警告:

 

         warning C4541: “dynamic_cast”用在了带 /GR- 的多态类型“CBasic”上;

       可能导致不可预知的行为从而导致程序在执行时发生异常。

该设置在 Project->Setting中 C/C++ -> C++ Language中设置。

*/

 

#include <iostream>

using namespace std;

 

class CBasic

{

public:

     virtual int test(){return 0;} // 一定要是 virtual

};

 

class CDerived : public CBasic

{

public:

     virtual int test(){    return 1;}

};

 

int main()

{

     CBasic        cBasic;

     CDerived    cDerived;

     

     CBasic * pB1 = new CBasic;

     CBasic * pB2 = new CDerived;

 

     //dynamic cast failed, so pD1 is null.

     CDerived * pD1 = dynamic_cast<CDerived * > (pB1);   

                 

     //dynamic cast succeeded, so pD2 points to  CDerived object                                        


     CDerived * pD2 = dynamic_cast<CDerived * > (pB2);   

     

     //dynamci cast failed, so throw an exception.            

//    CDerived & rD1 = dynamic_cast<CDerived &> (*pB1);   

 

//dynamic cast succeeded, so rD2 references to CDerived object.

     CDerived & rD2 = dynamic_cast<CDerived &> (*pB2);   

 

     return 0;

}

转自论坛的文章,地址http://bbs.byr.cn/#!article/SoftDesign/14689,使用中发现红字部分曾经没注意过

C++ 中dynamic_cast&lt;&gt;的用法的更多相关文章

  1. Spring mvc中@RequestMapping 6个基本用法

    Spring mvc中@RequestMapping 6个基本用法 spring mvc中的@RequestMapping的用法.  1)最基本的,方法级别上应用,例如: Java代码 @Reques ...

  2. Delphi中stringlist分割字符串的用法

    Delphi中stringlist分割字符串的用法 TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 1.CommaT ...

  3. Linq中关键字的作用及用法

    Linq中关键字的作用及用法 1.All:确定序列中的所有元素是否都满足条件.如果源序列中的每个元素都通过指定谓词中的测试,或者序列为空,则为 true:否则为 false. Demo: 此示例使用 ...

  4. 标准C++中的string类的用法总结

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

  5. html中的alt和title用法区别

    html中的alt和title用法区别 首先明确一下概念,alt是html标签的属性,而title既是html标签,又是html属性.title标签这个不用多说,网页的标题就是写在<title& ...

  6. HTML中的target(_self,_blank)用法总结

    HTML中的target(_self,_blank)用法总结 最近一个项目,多次遇到target='_self', target='_blank'的用法, 再次总结一下: 1.<a>标签 ...

  7. jquery中append跟prepend的用法

    jquery中append和prepend的用法 append   是插入到元素中,并放到元素内的最后面prepend  是插入到元素中,并放到元素内的最前面例$("body"). ...

  8. js正则表达式中的问号几种用法小结

    这篇文章主要介绍了js正则表达式中的问号几种用法,比如+?,*?,{2,3}?可以停止匹配的贪婪模式,感兴趣的朋友可以参考下 在表示重复的字符后面加问号,比如+?,*?,{2,3}?可以停止匹配的贪婪 ...

  9. SQL Server 中 with tmp 临时表的用法

    SQL Server 中 with tmp 临时表的用法 ----------with临时表用法,有时候采用临时表比采用in的效率更高,避免了全表扫描. 实例中实现了查询普通题.大题.子题目的sql ...

随机推荐

  1. HDU 1498 50 years, 50 colors

    题目大意:给你一个 n*n 的矩阵,每个格子上对应着相应颜色的气球,每次你可以选择一行或一列的同种颜色的气球进行踩破,问你在K次这样的操作后,哪些颜色的气球是不可能被踩破完的. 题解:对于每一种颜色建 ...

  2. docpad建站记录

    记一下用docpad建站的过程作为备忘.不定时更新 why docpad wordpress对我来说太过于臃肿,我就想要个代码干净的小站来写东西.想要个markdown为基础的静态站. 比较流行的St ...

  3. Sicily-1152 回溯算法

    一.题意: 走日字,每个位置都有有8种新位置,从起点开始刚好过29步遍历其他位置一遍. 二.代码 // // main.cpp // Sicily-1152 回溯算法 // // Created by ...

  4. C++那些库

    在C++中,库的地位是非常高的. 基础库 boost“准”标准库 boost库是经过千锤百炼,可移植提供源代码的C++库,作为标准库的后备.跨平台的.有一个大的C++社区支持 Boost中比较著名的库 ...

  5. JavaScript 覆盖document.createElement 方法 解决window.close在火狐下不兼容问题)

    近期项目遇到了问题,有个asp.net web程序仅仅能在IE7 执行.如今xp都淘汰了,大家都用IE8-IE11,因此这个web app也须要升级 适应全部IE版本号.照成IE版本号不兼容的问题主要 ...

  6. UI界面

    http://www.uimaker.com/uimakerhtml/uidesign/uisoft/2016/0323/122862.html http://www.uimaker.com/uima ...

  7. FreeCodeCamp:Return Largest Numbers in Arrays

    要求: 右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组. 提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组的每个元素. 结果: l ...

  8. linux driver: input子系统

    <韦东山Linux视频第2期_从零写驱动\第13课第1节 输入子系统概念介绍_P.wmv> 本视频对输入子系统的结构进行了详细的剖析,通过本视频,可以了解到input核心包括了设备和han ...

  9. C++对C语言的非面向对象特性扩充(1)

    我将分3篇来介绍C++相对于C在非对象特性上的扩充,今天要讲的是C++在注释,输入输出,局部变量说明的扩充,以及const修饰符与C中的#define的比较. 1.C++注释除了包括原有C的块注释/* ...

  10. [C#参考]委托机制

    1. 委托概述 这是一个新的概念,但是其本质并不是什么新鲜的事物,委托本质上就是一个类.只不过一般的类是数据的集合,委托保存的是一个或者多个方法.委托是引用类型,因此委托有引用和对象,同时委托对象中包 ...