static_cast, dynamic_cast探讨

来源:互联网 发布:网络歌我们都是东北人 编辑:程序博客网 时间:2024/05/10 08:29

static_cast

用法:static_cast < type-id > ( expression )
说明:该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
它主要有如下几种用法:
用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。
用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
把void指针转换成目标类型的指针(不安全!!)
把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。

#include "stdafx.h"#include<iostream>using namespace std;class Base{protected:    int size;public:    void setSize(int n)    {        size = n;    }};class Derived:public Base{public:    Derived(int n)    {        size = n;        cout << "构造结果" << size << endl;    }    void setSize1(int n)    {        static_cast<Base *> (this)->setSize(n);        cout << "this指针结果" << size<<endl;    }    void setSize2(int n)    {        static_cast<Base>(*this).setSize(n);        //实际上是生产一个base class 对象副本,改变的是副本里面的size值,this里面的size值不变        cout << "this对象结果" << size<<endl;    }    void setSize3(int n)    {        Base::setSize(n);        cout << "Base set_size结果" << size << endl;    }    void setSize4(int n)    {        static_cast<Base&>(*this).setSize(n);        cout << "this引用结果" << size << endl;    }};int _tmain(int argc, _TCHAR* argv[]){    Derived d(0);    d.setSize1(1);    d.setSize2(2);    d.setSize3(3);    d.setSize4(4);    return 0;}

这里写图片描述
结论:使用static_cast进行向上转型时,应使用指针或引用;(不宜使用static_cast进行向下转型,应使用dynamic_cast)

dynamic_cast

**用法:**dynamic_cast < type-id > ( expression )
说明:该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
来源:为什么需要dynamic_cast强制转换?
简单的说,当无法使用virtual函数的时候
在交叉转换时,使用static_cast进行转换是不被允许的,将在编译时出错;而使用 dynamic_cast的转换则是允许的,结果是空指针。

0 0
原创粉丝点击