dynamic_cast

C++四种强制转换

梦想的初衷 提交于 2020-03-30 02:37:35
C语言的强制转换为在数据面前之间加数据类型进行转换,即(目标数据类型)原数据类型。 c++ 为了更好的 区分强制转换的类型 ,达到 见其名知其意 的效果,共将强制转换分为四种,即 1、static_cast<目标数据类型>原数据类型 2、const_cast<目标数据类型>原数据类型 3、reinterpret_cast<目标数据类型>原数据类型 4、dynamic_cast<目标数据类型>原数据类型 解析 static_cast<>() 1)用于类层次结构中基类和派生类之间指针或引用的转换 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的 进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的 2)用于基本数据类型之间的转换,如把int转换成char。这种转换的安全由开发人员来保证 3)把空指针转换成目标类型的空指针 4)把任何类型的表达式转换为void类型 注意:static_cast不能转换掉expression的const、volitale或者__unaligned属性。  static_cast:可以实现C++中内置基本数据类型之间的相互转换。 如果涉及到类的话,static_cast只能在 有相互联系的类型中进行相互转换, 不一定包含虚函数。 const_cast<>() cost_cast即用于强制转换 指针或者引用 的

C++中“强制转换”的四大天王

只谈情不闲聊 提交于 2020-03-17 06:32:28
RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。 RTTI机制的产生 为什么会出现RTTI这一机制,这和C++语言本身有关系。和很多其他语言一样,C++是一种静态类型语言。其数据类型是在编译期就确定的,不能在运行时更改。然而由于面向对象程序设计中多态性的要求,C++中的指针或引用(Reference)本身的类型,可能与它实际代表(指向或引用)的类型并不一致。有时我们需要将一个多态指针转换为其实际指向对象的类型,就需要知道运行时的类型信息,这就产生了运行时类型识别的要求。和Java相比,C++要想获得运行时类型信息,只能通过RTTI机制,并且C++最终生成的代码是直接与机器相关的。 我对Java的运行时类型识别不是很熟悉,所以查了一下相关资料:Java中任何一个类都可以通过反射机制来获取类的基本信息(接口、父类、方法、属性、Annotation等),而且Java中还提供了一个关键字,可以在运行时判断一个类是不是另一个类的子类或者是该类的对象,Java可以生成字节码文件,再由JVM(Java虚拟机)加载运行,字节码文件中可以含有类的信息。 typeid和dynamic_cast操作符 RTTI提供了两个非常有用的操作符

RTTI(运行时类型识别)

空扰寡人 提交于 2020-03-17 05:37:50
   运行时类型识别(Run-time type identification , RTTI) ,是指在只有一个指向基类的指针或引用时,确定所指对象的准确类型的操作。其常被说成是C++的四大扩展之一(其他三个为异常、模板和名字空间)。 使用RTTI的两种方法:    1、typeid()   第一种就像sizeof(),它看上像一个函数,但实际上它是由编译器实现的。 typeid() 带有一个参数,它可以是一个对象引用或指针,返回全局 typeinfo类 的常量对象的一个引用。可以用运算符“= =”和“!=”来互相比较这些对象,也可以用 name() 来获得类型的名称。如果想知道一个指针所指对象的精确类型,我们必须逆向引用这个指针。比如: #include <typeinfo> #include <iostream> #include <cmath> using namespace std; class Shape { public : int area(float r) { float s=3.14*pow(r,2); return s; } }; int main() { Shape* shape=new Shape; cout<< typeid(*shape).name()<<endl; system("pause"); }   运行结果为:   为了保持一致性,typeid

浅谈动态库符号的私有化与全局化

最后都变了- 提交于 2020-03-04 03:38:01
之前一篇《 记一个链接库导出函数被覆盖的问题 》中,描述了这样一个问题:动态库若想使用自己的符号,不受可执行程序(或其他动态库的影响),可以使用-Wl,-Bsymbolic链接参数或version_script来让动态库的符号自我解决,而不必通过全局符号表来动态解决。 之前的文章也提到,使用-Wl,-Bsymbolic这样的方法是存在隐患的。最近又遇到这样的例子,动态库使用了私有的符号导致dynamic_cast、throw可能达不到程序预想的效果。 另外,除了显式的使用-Wl,-Bsymbolic、version_script这样的方法之外,通过dlopen打开的动态库也可能会使用到自己私有的符号。这种情况的发生,有如下条件: 1、可执行程序在链接的时候没有使用-Wl,-E选项。则链接器在生成可执行程序的时候默认不会将其符号导出到全局符号表; 2、在链接生成可执行程序的目标文件中没有列举将要dlopen的动态库(通常都是这样,静态链接的时候并不知道运行时需要dlopen什么样的动态库)。否则的话,就算没有-Wl,-E选项,可执行程序也会将目标文件中的动态库所需要的符号导出到全局符号表; 满足这两个条件的话,动态库在通过dlopen加载的时候,可能就看不到可执行程序中的相同符号,而使用自己私有的符号。 例: [class.h] class AAA { public: virtual

浅谈动态库符号的私有化与全局化

偶尔善良 提交于 2020-03-04 03:35:37
之前一篇《 记一个链接库导出函数被覆盖的问题 》中,描述了这样一个问题:动态库若想使用自己的符号,不受可执行程序(或其他动态库的影响),可以使用-Wl,-Bsymbolic链接参数或version_script来让动态库的符号自我解决,而不必通过全局符号表来动态解决。 之前的文章也提到,使用-Wl,-Bsymbolic这样的方法是存在隐患的。最近又遇到这样的例子,动态库使用了私有的符号导致dynamic_cast、throw可能达不到程序预想的效果。 另外,除了显式的使用-Wl,-Bsymbolic、version_script这样的方法之外,通过dlopen打开的动态库也可能会使用到自己私有的符号。这种情况的发生,有如下条件: 1、可执行程序在链接的时候没有使用-Wl,-E选项。则链接器在生成可执行程序的时候默认不会将其符号导出到全局符号表; 2、在链接生成可执行程序的目标文件中没有列举将要dlopen的动态库(通常都是这样,静态链接的时候并不知道运行时需要dlopen什么样的动态库)。否则的话,就算没有-Wl,-E选项,可执行程序也会将目标文件中的动态库所需要的符号导出到全局符号表; 满足这两个条件的话,动态库在通过dlopen加载的时候,可能就看不到可执行程序中的相同符号,而使用自己私有的符号。 例: [class.h] class AAA { public: virtual

C++中四种强制类型转换区别详解

情到浓时终转凉″ 提交于 2020-03-02 13:22:19
 C++即支持C风格的类型转换,又有自己风格的类型转换。C风格的转换格式很简单,但是有不少缺点的:   1.转换太过随意,可以在任意类型之间转换。你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成一个派生类对象的指针,这些转换之间的差距是非常巨大的,但是传统的C语言风格的类型转换没有区分这些。   2.C风格的转换没有统一的关键字和标示符。对于大型系统,做代码排查时容易遗漏和忽略。   C++风格完美的解决了上面两个问题。1.对类型转换做了细分,提供了四种不同类型转换,以支持不同需求的转换;2.类型转换有了统一的标示符,利于代码排查和检视。下面分别来介绍这四种转换:static_cast、dynamic_cast、const_cast和reinterpre_cast. 一、static_cast转换   1.基本用法:static_cast<type-id> expression   2.使用场景:   a、用于类层次结构中基类和派生类之间指针或引用的转换   上行转换(派生类---->基类)是安全的;   下行转换(基类---->派生类)由于没有动态类型检查,所以是不安全的。   b、用于基本数据类型之间的转换,如把int转换为char,这种带来安全性问题由程序员来保证   c、把空指针转换成目标类型的空指针   d

C++的强制类型转换

拜拜、爱过 提交于 2020-02-28 19:18:08
c/c++强制类型转换 Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符。比如,为了转换一个类型为doubole的浮点数的指针到整型: 代码: int i; double d; i = (int) d;或者:i = int (d); 对于具有标准定义转换的简单类型而言工作的很好。然而,这样的转换符也能不分皂白的应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:'reinterpret_cast', 'static_cast', 'dynamic_cast' 和 'const_cast',目的在于控制类(class)之间的类型转换。 代码: reinterpret_cast<new_type>(expression) dynamic_cast<new_type>(expression) static_cast<new_type>(expression) const_cast<new_type>(expression) 1 reinterpret_cast reinterpret_cast 转换一个指针为其它类型的指针

C++语言里const_cast 在可变与不可变类型之间转换一、常量指针被转化成非常量指针,并且仍然指向原来的对象;

可紊 提交于 2020-02-19 13:45:21
在C语言里强制类型转换的方法非常简单,只要在要转换的变量前用括号确定要转换的类型即可,如要将一个double型的变量强制转换为int类型,代码如下: double x = 3.14; int y = (int)x; 另外,还可有更高级的转换,如把int *类型的变量转换为int ,代码如下: int x = 20; int *p = &x; int y = (int)p; 在C++语言里为了让强制类型转换更明显,更安全,所以把不同情况下的强制类型转换分为四种,分别为: static_cast 静态类型转换,属于最安全的强制类型转换。 const_cast 在可变与不可变类型之间转换 dynamic_cast 在多态的情况下,父子类之间的转换 reinterpret_cast 所有类型间的转换,最不安全的转换 1. C++中的 static_cast 执行非多态的转换,用于代替C中通常的转换操作。因此,被做为隐式类型转换使用。比如:   int i;   float f = 166.7f;   i = static_cast <int>(f);   此时结果,i的值为166。 2. C++中的 reinterpret_cast 主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如:   int i;

c++ RTTI(运行时类型识别)

跟風遠走 提交于 2020-02-02 16:21:54
通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型。c++通过下面两个操作符提供RTTI。 (1)typeid:返回指针或引用所指对象的实际类型。 (2)dynamic_cast:将基类类型的指针或引用安全的转换为派生类型的指针或引用。 对于带虚函数的类,在运行时执行RTTI操作符,返回动态类型信息;对于其他类型,在编译时执行RTTI,返回静态类型信息。 当具有基类的指针或引用,但需要执行派生类操作时,需要动态的强制类型转换(dynamic_cast)。这种机制的使用容易出错,最好以虚函数机制代替之。 dynamic_cast 操作符 如果dynamic_cast转换指针类型失败,则返回0;如果转换引用类型失败,则抛出一个bad_cast类型的异常。 可以对值为0的指针使用dynamic_cast,结果为0。 dynamic_cast会首先验证转换是否有效,只有转换有效,操作符才进行实际的转换。 if (Derived *derivedPtr = dynamic_cast<Derived *>(basePtr)) { // use the Derived object to which derivedPtr points } else { // basePtr points at a Base object // use the Base object to

C++中的显示类型转换

拥有回忆 提交于 2020-01-10 08:49:01
C++中显示转换也成为强制类型转换(cast),有四种:static_cast、dynamic_cast、const_cast、reinterpret_cast。命名的强制类型转换符号一般形式如下: cast_name<type>(expression); 以下分别介绍 一、static_cast 任何具有明确定义的类型转换,只要不包含底层const都可以使用static_cast。好吧这句话我不是很懂,换句话:编译器隐式执行的任何类型转换都可以由static_cast显示完成。也就是说,两类型之间可以发生隐式的转换,就可以用static_cast显示转换,有点意思。但要知道的是C++基本类型的指针之间不含有隐式转换(void*除外、const的有些也是可以的),需要 显示转换 。什么意思?如下: double d=3.14; int i=d; //编译器的隐式转换,等价于下面这条语句 int i=static_cast<int>(d); /*指针之间的转换*/ char str[]="good"; char *ptr=str; int *p=static_cast<int *>(ptr); //编译错误,两者之间的转换要显式,如下 int *p=(int *)(ptr); 仅当类型之间可隐式转换时(除类层次见的下行转换以外),static_cast的转换才是合法的,否则将出错。