static_cast 和 dynamic_cast 区别
来源:互联网 发布:pp助手mac版备份 编辑:程序博客网 时间:2024/05/17 06:23
1. 语法
static_cast < type-id > ( expression )
dynamic_cast <type-id > ( expression )
2. 用法
static_cast:
①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
dynamic_cast:
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;
①dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换,实际上只有在基类指针转换为子类指针是才有意义。
3.注意
为何使用dynamic_cast转换类指针时,需要虚函数呢?
因为派生类会继承基类的虚函数表,所以通过这个虚函数表,我们就可以知道该类对象的父类,在转换的时候就可以用来判断对象有无继承关系
4.实例
#include <iostream>using namespace std;class Base1{public:virtual void f() { cout << "Base1::f" << endl; }void f1(){cout << "Base1::f1" << endl;}private:double x;double y;};class Derived1 : public Base1{public:virtual void f(){cout << "Derived1::f" << endl; }virtual void k(){cout << "Derived1::k" << endl; }private:double z;};void Test1(){// 对于单继承,// 如果pD真的指向Derived1,用dynamic_cast和static_cast效果相同Base1 *pD = new Derived1;Derived1 *pD1 = dynamic_cast<Derived1*>(pD);pD1->f();pD1->k();pD1->f1();Derived1 *pD2 = static_cast<Derived1*>(pD);pD2->f();pD2->k();pD2->f1();// 但是如果pB1不是真的指向Derived1,则用dynamic_cast则返回NULL,能够更早的禁止error的发生,// 如果用static_cast虽然返回的不为NULL,但是运行时可能抛出exception。/**///// Error code//Base1 *pB1 = new Base1();//Derived1 *pD3 = static_cast<Derived1*>(pB1);//pD3->f();//pD3->k();//pD3->f1();//Derived1 *pD4 = dynamic_cast<Derived1*>(pB1);//pD4->f();//pD4->k();//pD4->f1();}int _tmain(int argc, _TCHAR* argv[]){Test1();system("pause");return 0;}
0 0
- static_cast 和 dynamic_cast 区别
- static_cast 和dynamic_cast区别
- static_cast 和 dynamic_cast的区别
- static_cast 和 dynamic_cast 的区别
- dynamic_cast 和static_cast 的区别
- dynamic_cast和 static_cast的区别
- static_cast和dynamic_cast的联系和区别
- static_cast 和 reinterpret_cast的区别以及dynamic_cast
- static_cast、dynamic_cast、const_cast和reinterpret_cast的区别
- static_cast,dynamic_cast和const_cast的区别
- static_cast, dynamic_cast, reinterpret_cast ,const_cast区别和使用
- C++ static_cast和dynamic_cast的区别
- dynamic_cast、static_cast、const_cast和reinterpret_cast的区别
- static_cast dynamic_cast 区别
- type_cast、static_cast和dynamic_cast
- static_cast,dynamic_cast和reinterpret_cast
- static_cast和dynamic_cast
- dynamic_cast和static_cast
- Windows 7 IIS7.5上部署MVC实例
- 正则表达式积累实例
- Linux 下安装OpenGL
- buffer cache实验3-lru和lruw链表
- wpf中如何得到数据绑定树节点的父节点
- static_cast 和 dynamic_cast 区别
- 程序员最艰巨的十大任务
- Eclipse常用开发插件
- linux的locale
- polysh scp ssh-copy-id
- flex builder 里面的stage问题
- VC++实现位图显示透明效果
- ORACLE数据库SQL优化--->优化器基础知识
- NYOJ 844 A+B Problem(V)