dynamic_cast, RTTI, 整理】的更多相关文章

主要是参考下图,了解内存布局,然后写个实例程序就差不多明白了,但是需要熟悉指针转换. 1) 只有多态类才有RTTI信息,dynamic_cast正是运用RTTI进行转换,属于运行时类型检查. 2) dynamic_cast判断两个指针是否能转换时,用RTTI可以知道当前实际对象,然后遍历自己所有的父类,看是否有与目标类型一致的,如果有就可以进行转换. 3) dynamic_cast是安全的,可以通过检查返回值或异常捕捉来判断是否转成功.其中检查返回值用于指针转换,异常捕捉用于引用转换. 4) 补…
dynamic_cast:将基类类型的指针向派生类指针安全转换.多用于下行转换.上行转换时,和static_cast是一样的.C++类型转换看这里.而const_cast用来修改类型的const或volatile属性...下面主要说多态下的RTTI: 使用条件: 基类应有虚函数. 编译器需启用Runtime Type Information/Identification(RTTI),运行时类型信息.VS下在项目属性页下启用,如下,选 是: (VS2013测试:默认的留空不选也能正常使用dynam…
将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理          即会作一定的判断.        对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针:        对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用. 注意:dynamic_cast在将父类cast到子类时,父类必须要有虚函数.例如在下面的代码中将CBasic类中的test函数不定…
一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be determined during program execution. There are three main C++ language elements to run-time type information: The dynamic_cast operator. Used for conversio…
dynamic_cast注意: 1.只能应用于指针和引用的转换: 2.要转换的类型中必须包含虚函数: 3.转换成功则返回地址,如果失败则返回NULL: 参见项目:RTTI…
一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be determined during program execution. There are three main C++ language elements to run-time type information: The dynamic_cast operator. Used for conversio…
#include <iostream> #include <cstdlib> #include <ctime> using std::cout; class Grand { private: int hold; public: Grand(int h=0):hold(h){} virtual void Speak() const {cout << "I am a grand class!\n";} virtual int Value()…
通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型.    (2)dynamic_cast:将基类类型的指针或引用安全的转换为派生类型的指针或引用. 对于带虚函数的类,在运行时执行RTTI操作符,返回动态类型信息:对于其他类型,在编译时执行RTTI,返回静态类型信息. 当具有基类的指针或引用,但需要执行派生类操作时,需要动态的强制类型转换(dynamic_cast).这种机制的使用容易出错…
RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.   编辑本段RTTI介绍 RTTI提供了以下两个非常有用的操作符:   (1)typeid操作符,返回指针和引用所指的实际类型:   (2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用.   面向对象的编程语言,象C++,Java,delphi都提供了对RTTI的支持. 本文将简略介绍 RTT…
RTTI   运行时类型识别 typeid  ------  dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3.转换成功返回的是子类的地址,失败返回NULL typeid注意事项: 1.typeid返回一个type_info对象的引用 2.如果想通过基类获得派生类的数据类型,基类必须带有虚函数 3.只能获取对象的实际类型 异常处理: 1.关键字: try... catch....    throw 尝试...…
typeid操作符的作用就是获取一个表达式的类型.返回结果是const type_info&.不同编译器实现的type_info class各不相同.但c++标准保证它会实现一个name()方法,该方法返回类型名字的c-style字符串. 如果typeid的操作数不是类类型或者是没有虚函数的类,则typeid指出该操作数的静态类型.如果操作数是定义了至少一个虚函数的类类型,则在运行时计算类型. // expre_typeid_Operator.cpp // compile with: /GR /…
dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用. >>>>>>>>>>>编译器的RTTI设置>>>>>>>>>>> dynamic_cast提供RTTI(Run-Time Type Information),也就是运行时类型识别.它对编译器有要求,需要编译器启动“运行时类型信息”这一选项.当编译器不开启RTTI时,运行含有dynam…
参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.   RTTI提供了以下两个非常有用的操作符:   (1)typeid操作符,返回指针和引用所指的实际类型:   (2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用.   面向对象的编程语言,象C++,Java,delphi都提供了对RTTI的支持. 本文将简略介绍 RTTI 的一些背…
RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI机制的产生 为什么会出现RTTI这一机制,这和C++语言本身有关系.和很多其他语言一样,C++是一种静态类型语言.其数据类型是在编译期就确定的,不能在运行时更改.然而由于面向对象程序设计中多态性的要求,C++中的指针或引用(Reference)本身的类型,可能与它实际代表(指向或引用)的类型并不一致…
RTTI (Run Time Type info) 这个神奇的东西用于存储类的相关信息,用于在运行时识别类对象的信息.C++ 里面只记录的类的名字和类的继承关系链.使得编译成二进制的代码,对象可以知道自己的名字(ASCII),以及在继承链中的位置. C++ 里面提供 一个关键字 typeid , 一个数据类型 typeinfo,以及对应的头文件 typeinfo.h 1 #include <iostream> 2 #include <typeinfo> 3 using namesp…
一.定义:RTTI:Run Time Type Identification ,运行时类型识别:指程序能够使用基类的指针或引用来检索其所指对象的实际派生类型.二.使用方式:C++中有两个操作符提供RTTI: (1)typeid 操作符:返回指针或引用所指对象的实际类型. (2)dynamic_cast 操作符:将基类类型的指针或引用安全地转换为派生类型的指针和引用. 注:此二操作符只为带有一个或多个虚函数的类返回动态类型信息----即在运行时执行RTTI操作符:对于其他类型则返回静态类型的信息-…
很早看了MFC的一些宏的实现,什么RUNTIME_CLASS, DECLARE_DYNAMIC, DECLARE_DYNCREATE,IMPLEMENT_DYNCREATE, etc,看了就烦,现在整理下,免的忘了. 代码实现 (注:以下宏及其实现取自MFC) DECLARE_DYNAMIC Define:#define DECLARE_DYNAMIC(class_name) "public: "    static const AFX_DATA CRuntimeClass class…
c++强制类型转换:dynamic_cast.const_cast .static_cast.reinterpret_cast 博客分类: C/C++ CC++C#编程数据结构  dynamic_cast:   通常在基类和派生类之间转换时使用const_cast:   主要针对const和volatile的转换static_cast:   一般的转换(no run-time check)通常,如果你不知道该用哪个,就用这个.   reinterpret_cast:   用于进行没有任何关联之间…
static_cast <typeid>(exdlvssion) static_cast 很像 C 语言中的旧式类型转换.它能进行基础类型之间的转换,也能将带有可被单参调用的构造函数或用户自定义类型转换操作符的类型转换,还能在存有继承关系的类之间进行转换(即可将基类转换为子类,也可将子类转换为基类),还能将 non-const对象转换为 const对象(注意:反之则不行,那是const_cast的职责.). double d = 3.14159265; int i = static_cast&…
作为四个内部类型转换操作符之一的dynamic_cast和传统的C风格的强制类型转换有着巨大的差别.除了dynamic_cast以外的转换,其行为的都是在编译期就得以确定的,转换是否成功,并不依赖被转换的对象.而dynamic_cast则不然.在这里,不再讨论其他三种转换和C风格的转换.首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型,这种检查不是语法上的,而是真实情况的检查.先看RTTI相关…
本文介绍c++的RTTI的基本用法,并初步研究RTTI的实现原理. 1. 什么是RTTI RTTI即运行时类型识别(runtime type identification),用于判断指针或引用所绑定对象的动态类型,由两个运算符实现: dynamic_cast  将基类指针或引用安全地转换为派生类的指针或引用 typeid  返回表达式的类型 2. 为什么要用RTTI 当我们需要对象的类型信息时,比如需要使用非虚函数,有必要知道当前指针绑定的对象的动态类型. 3. 如何使用RTTI dynamic…
这个知识点被遗漏了,可以结合之前的这篇文章看类型转换这个知识点. RTTI(Run-Time Type Information,运行时类型信息)即程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. C++中有两个操作符提供RTTItypeid:返回指针或引用所指对象的实际类型.dynamic_cast:将基类类型的指针或引用安全地转换为派生类型的指针和引用.(点击这里查看) typeid头文件:# include<typeinfo>语法--两种形式:typeid (ty…
RTTI 是“Runtime Type Information”的缩写,意思是:运行时类型信息.它提供了运行时确定对象类型的方法.本文将简略介绍 RTTI 的一些背景知识.描述 RTTI 的概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI:本文还将详细描述两个重要的 RTTI 运算符的使用方法,它们是 typeid 和 dynamic_cast. 其实,RTTI 在C++中并不是什么新的东西,它早在十多年以前就已经出现了.但是大多数开发人员,包括许多高层次的C++程序员对它并不怎…
RTTI(Run-Time Type Information,通过运行时类型信息)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个非常有用的操作符: (1)typeid操作符,返回指针和引用所指的实际类型. (2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用.  面向对象的编程语言,象C++,Java,delphi都提供了对RTTI的支持. 本文将简略介绍 RTTI 的一些背景知识.描述 RTTI 的概念…
dynamic_cast是一个操作符,其用法不再赘述.查看汇编码可以发现实际调用的是这个函数__RTDynamicCast,其内部实现如下: rtti.h: #pragma once extern "C" { #include <windows.h> }; typedef const type_info TypeDescriptor; struct PMD { ptrdiff_t mdisp; //vftable offset ptrdiff_t pdisp; //vfta…
RTTI是"Runtime Type Information"的缩写,意思是:运行时类型信息.它提供了运行时确定对象类型的方法. 最近在写的一些东西,不想使用MFC之类的框架,但是却在很多地方需要根据名称确定指针的转换类型或者利用抽象工厂生产抽象的类对象指针... 我很不喜欢不容易维护且难看的"switch case",而C++本身的RTTI功能又显得很单薄...看来只有自己写一个C++的RTTI实现了. RTTI.h: //////////////////////…
一月 27th, 2005 by 猛禽 风焱在<“18般武艺”?>中说到他碰上的被多种语言纠缠的问题.我在回复里说: 很多语言只要能看懂几分就行了,没必要每一种都精通 但是如果只会很少的一两种语言也是不行的. 因为看了一些关于JAVA的反射技术的应用,忽然想到DELPHI的RTTI也很强,于是试着拿数据集下手,用RTTI来实现它的对象化.用了两个晚上时间就搞定了(要不是因为开始时搞错对象–基类用了TObject,其实应该是用TPersistent才对),果然很简单. 假设有一个ADODataS…
白杨 http://baiy.cn “在正确的场合使用恰当的特性” 对称职的C++程序员来说是一个基本标准.想要做到这点,首先要了解语言中每个特性的实现方式及其开销.本文主要讨论相对于传统 C 而言,对效率有影响的几个C++新特性: 编译时开销 运行时开销 相关文档: C++编码规范与指导 C++异常机制的实现方式和开销分析 多处理器环境和线程同步的高级话题 C++0x(C++11)新特性点评 相对于传统的 C 语言,C++ 引入的额外开销体现在以下两个方面: 编译时开销 模板.类层次结构.强类…
/*这是从网上摘下的样例,主要讲述了 dynamic_cast<> 的用法.*/ /* 作用:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会依据基类指针是否真正指向继承类指针来做对应处理,        即会作一定的推断.        对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针:        对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用.   注意:dynamic_cast在…
danamic_cast 动态类型转换 ----RTTI提供的的操作符 ----动态:在执行阶段 ----类型转换:检測指针或引用类型,true->转换 ----体现价值的地方:用于多态 ----如果出现这种情况: 父类A虚函数aa()指针p,子类B指针p1,无关类C指针p2 你的p1和p2在一起传进函数 函数的功能将传进来的指针强转成A类的,调用函数aa() C类没有继承A,这样会崩溃 前提:1.C和B里没有专门用来鉴别的成员变量 2.不能让C也继承A ----工作中遇到的问题: 用第三方的软…