C++ 中dynamic_cast<>的使用方法小结_C 语言

       即会作一定的判断。
       对指针进行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;
}

时间: 2024-08-03 09:43:08

C++ 中dynamic_cast&amp;lt;&amp;gt;的使用方法小结_C 语言的相关文章

c++获取sqlite3数据库表中所有字段的方法小结_C 语言

常用方法: 1.使用sqlite3_get_table函数 2.获取sqlite创建表的sql语句字符串,然后进行解析获取到相应的字段 3.采用配置文件的方式,将所有字段名写入配置文件 下面针对这三个方法给大家逐一详细介绍. 方法1:使用sqlite3_get_table函数 代码: char *dbname = "test.db"; int rc = sqlite3_open(dbname, &db); if (rc == SQLITE_OK) { char sql[256]

C语言中的各种文件读写方法小结_C 语言

前言    找工作的时候,曾经用C语言练习过一段时间的算法题目,也在几个还算出名的OJ平台有过还算靠谱的排名.之前以为C语言只限于练习一下算法,但是工作中的一个问题解决让我意识到C语言的用处还是非常广泛的.下面介绍一下,如果用C语言来操作文件保存一个字符串,和读取一个字符串.算法中往往都是printf来打印出结果,但是真实工作中往往通过文件来进行一些持久化的存储工作. C-File I/O    文件的I/O操作是每一门语言的重点,因此这里我先来介绍一下如何用C语言去进行文件的I/O操作. 文件

C语言中对于循环结构优化的一些入门级方法简介_C 语言

一.代码移动 将在循环里面多次计算,但是结果不会改变的计算,移到循环外面去. 例子: 优化前: void lower1(char *s){ int i; for(i=0;i<strlen(s);++i) if(s[i]>='A'&&s[i]<='Z') s[i]-=('A'-'a'); } 优化后: void lower2(char *s){ int i; int len=strlen(s); for(int i=0;i<len;++i) if(s[i]>='

C#中使用split分割字符串的几种方法小结_C#教程

第一种方法: 复制代码 代码如下: string s=abcdeabcdeabcde;string[] sArray=s.Split(c) ;foreach(string i in sArray)Console.WriteLine(i.ToString()); 输出下面的结果:abdeabdeabde 第二种方法: 我们看到了结果是以一个指定的字符进行的分割.使用另一种构造方法对多个字符进行分割: 复制代码 代码如下: string s=abcdeabcdeabcdestring[] sArra

C++中字符串以及数组和指针的互相使用讲解_C 语言

C++字符串与指针 在C++中可以用3种方法访问一个字符串(在第5章介绍了前两种方法). 用字符数组存放一个字符串 [例]定义一个字符数组并初始化,然后输出其中的字符串. #include <iostream> using namespace std; int main( ) { char str[]="I love CHINA!"; cout<<str<<endl; return 0; } 运行时输出: I love CHINA! 用字符串变量存放

python中快速进行多个字符替换的方法小结_python

先给出结论: 要替换的字符数量不多时,可以直接链式replace()方法进行替换,效率非常高: 如果要替换的字符数量较多,则推荐在 for 循环中调用 replace() 进行替换. 可行的方法: 1. 链式replace() string.replace().replace()      1.x 在for循环中调用replace() 「在要替换的字符较多时」 2. 使用string.maketrans 3. 先 re.compile 然后 re.sub -- def a(text): char

static_cast,dynamic_cast,reinterpret_cast,const_cast的区别及用法详解_C 语言

1.static_cast对类的指针只能转换有继承关系的类.对普通的指针来说只能在void*和其他指针之间转换.它还可转换简单的类型,比如int到char等.不能提供数字到指针的转换.不能提供不同类型指针之间的转换比如int*到char*. 2.dynamic_cast提供安全的转换如果两个指针不存在继承关系转换会失败返回空指针,如果你提供一个错误的指针那样会发生内存访问异常,因为它会去比较两个类型的虚函数表.虚函数表的指针一般放在对象指针最开始的四字节中,你去访问一个错误的地址这样肯定会发生异

C++中const用法小结_C 语言

const在C++中使用十分广泛,不同位置使用的意义也不尽相同,所以想写篇文章对其做一个总结. 首先,明确const是"不变"这个基本意义,但是不变不意味着什么都不变,下面将会看到. 1. const与变量 基本原则:const变量(对象)不能被修改 const在变量中的引入和魔数有关,所谓"魔数"指的是突然出现的一个常量值(也叫字面值常量). for(int i = 0; i < 512; i++) { // todo } 上例中,512即为魔数,512突然

设计模式中的备忘录模式解析及相关C++实例应用_C 语言

备忘录模式旨在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.在命令模式中,备忘录模式经常还经常被用来维护可以撤销(Undo)操作的状态. 类图: Originator:负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态.Originator可根据需要决定Memento存储Originator的哪些内部状态. Memento:负责存储Originator对象的内部状态,并可防止Origin