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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 招教年龄超过4个月怎么办 淘宝上注册的店铺被别人用了怎么办 淘宝贷款后店铺转让了贷款怎么办 手机千牛发布宝贝类目找不到怎么办 亚马逊被移除销售权该怎么办 玉米煮水不够熟吃了怎么办 华为云手机找回关了找回手机怎么办 我的淘宝号被别人盗用开店怎么办 淘宝买东西发货了不想要了怎么办 两张单号一样罚款已被处理怎么办 58同城登录电话换了怎么办 在超市买的东西坏了怎么办 安卓系统无法安装第三方软件怎么办 金立手机报毒不能安装软件怎么办 js中下拉菜单被图片挡住怎么办 更换主机后用户名跟密码忘了怎么办 换手机号了京东账号登录不上怎么办 口令卡绑定时访问页面找不回怎么办 手机淘宝购物车不小心删除了怎么办 上淘宝网图片文字不清晰怎么办 淘宝店铺低消费人群占比多怎么办 微信只能在应用商城里面打开怎么办 淘宝买了特价商品店家不发货怎么办 红米5a装不下卡怎么办 红米3s流量太慢怎么办 红米3s触屏失灵怎么办 红米note的4g信号差怎么办 电信4g网速慢怎么办红米手机 红米3电信4g信号不好怎么办 红米note3无法连接4g怎么办 红米2a手机开不了机怎么办 红米2a不支持微信运动怎么办 红米2a开不了机怎么办 红米2a突然开不了机怎么办 苹果手机刷机刷到一半没电了怎么办 红米5手机死屏了怎么办 小米2a手机开不了机怎么办 小米2a长时间没用开不了机怎么办 红米手机玩游戏太卡怎么办 红米2a无限重启怎么办 红米3s像素好差怎么办