C++中的dynamic_cast和static_cast

代码:

 1 #include <cstdio>
 2 #include <iostream>
 3
 4 using namespace std;
 5
 6 class A{
 7     public:
 8         virtual void print(){
 9             cout<<"i am A"<<endl;
10         }
11 };
12
13 class B:public A{
14     public:
15 };
16
17 int main(){
18
19     A a;
20     B b;
21     A* pA = dynamic_cast<A*>(&b);
22     B* pB = dynamic_cast<B*>(&a);//会出现警告
23     cout<<pB<<endl;
24     pB = static_cast<B*>(&a);
25     cout<<pB<<endl;
26     pB->print();
27
28     return 0;
29 }

输出:

0
0x7fff4f697300
i am A

分析:

dynamic_cast下行转换(基类到子类)时要求基类是多态的,如果发现下行转换不安全,dynamic_cast返回一个null指针;

static_cast则没有这个要求,但在无关类指针转换时,编译器会报错,提升了安全性。

时间: 2024-10-03 14:45:34

C++中的dynamic_cast和static_cast的相关文章

c++中的强制转换static_cast、dynamic_cast、reinterpret_cast的不同用法儿

c++中的强制转换static_cast.dynamic_cast.reinterpret_cast的不同用法儿 虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用.其实这是很容易理解的,static决定的是一个变量的作用域和生命周期,比如:在一个文件中将变量定义为static,则说明这个变量只能在本Package中使用:在方法中定义一个static变量,该变量在程序开始存在直到程序结束:类中定义一个static成员,该成员随类

dynamic_cast 和 static_cast 隐式类型转换的区别

首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. int ival = 3;double dval = 3.14159; ival + dval;//ival被提升为double类型 2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型 int *pi = 0; 

c++ dynamic_cast 和 static_cast 的区别

今天在看王道宝典的时候看到dynamic_cast ,一直都没用过,也不了解,今天来总结一下. dynamic_cast 和 static_cast 都可以用来强制转换指针类型,但不同的是dynamic_cast在进行类层次间的下行转换时更加安全. dynamic_cast 运算符可以在执行期决定真正的类型.如果下行转换是安全的(也就是说,如果基类指针或者引用确实指向一个派生类对象),这个运算符会传回转型过的指针.如果下行转换不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个

dynamic_cast、static_cast、const_cast和reinterpret_cast的区别

           C++的类型转换分为两种:隐式转换和显示转换. 一. 对于隐式转换,就是标准的转换,在很多时候,不经意间就发生了,例如int和float加法,int类型就会被隐式转换为float了,这种称为升级转换.还有就是把等号右边的值转换为左边的类型,再赋值.还有类变量作为参数传递给函数: class B { public: int num; B(int a) { num=a; } } B show(B b) { return b; } show(5);//这里也发生了隐式转换,将5转

C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用

C风格的强制转换较简单,如将float a转换为int b,则可以这样:b = (int)a,或者b=int(a). C++类型转换分为隐式类型转换和显示类型转换. 隐式类型转换又称为标准转换,包括以下几种情况: (1).算术转换:在混合类型的算术表达式中,最宽的数据类型成为目标转换类型: (2).一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型: (3).将一个表达式作为实参传递给函数调用,此时形参和实参类型不一致:目标转换类型为形参的类型: (4).从一个函数返回一个表达式,

C++中static_cast, dynamic_cast用法

前言 Android的Framework层源码中有很多强制类型转换函数的调用.写惯了C代码的人一般都习惯下面这种强制转换方式: double a = 89; int b = (int)a; 但是,在C++代码中,不推荐使用C这种(type-id)的强制转换风格代码,更推荐使用C++的标准类型转换符:static_cast和dynamic_cast. static_cast static_cast的函数原型如下: static_cast<type-id>(expression) 说明: 该运算符

C++中static_cast和dynamic_cast强制类型转换

在C++标准中,提供了关于类型层次转换中的两个关键字static_cast和dynamic_cast. 一.static_cast关键字(编译时类型检查) 用法:static_cast < type-id > ( expression ),该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性,它主要有如下几种用法: (1)用于基本数据类型之间的转换,如把int转换为char,把int转换成enum,但这种转换的安全性需要开发者自己保证(这可以理解为保证

总结C++中的所有强制转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast)

做个笔记:源自论坛:http://bbs.csdn.net/topics/210039564 总结C++中的所有强制转换函数(const_cast,reinterpret_cast,static_cast,dynamic_cast) C 风格(C-style)强制转型如下: (T) expression // cast expression to be of type T 函数风格(Function-style)强制转型使用这样的语法: T(expression) // cast express

【转】C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析

原文链接:http://blog.csdn.net/bzhxuexi/article/details/17021559 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. int ival = 3;double dval = 3.14159; ival + dval;//ival被