c++中的dynamic_cast

c++中的 static_castdynamic_cast

dynamic_cast用于类层次的上行转换(派生类向基类转换)以及下行转换(基类向派生类转换),相比 static_cast ,其安全性要高一点儿。考虑如下的情形:

    #include <iostream>
    using std::cout;using std::endl;
    class base{
    public:
        base(int val):a(val){}
        virtual void print(){
            cout << "base's print()\n";
        }
    public:
        int a;
    };
    class derived:public base{
    public:
        derived(int val1,int val2):base(val1),b(val2){}
        virtual void print(){
            cout << "derived's print()\n";
        }
    public:
        int b;
    };
    int main(){
        base *p_base;
        derived *p_derived;
        base base_obj(1);
        derived derived_obj(2,3);
        p_base = &base_obj;
        p_derived = static_cast<derived*>(p_base);
        cout << p_derived->b;
        p_derived = dynamic_cast<derived*>(p_base);
        if(p_derived != NULL){
        std::cout << p_derived->b;
        }
    }

上面中的cout << p_derived->b得到的值是一个莫名其妙的值,其原因在于我们的p_derived虽然是一个derived指针,但是其指向的却是一个base对象,p_defrived的静态类型仅仅决定编译器如何解释p_derived指向的内存区域,这里我们将指向base对象base_obj的指针p_base通过static_cast运算符强制转换为一个p_derived指针,那么就意味着编译器要按照derived对象的内存布局来解释base对象base_obj了。但是!但是!,base对象base_obj是没有derived对象的数据成员b的,在其内存布局中,肯定也就没有b的位置啦!那会怎么样呢?越界了呗。访问了不属于base对象base_obj内存区域的块,得到的自然是一个莫名其妙的值!
谈了这么多,该说说dynamic_cast了。使用dynamic_cast来进行转换,以上面代码为例,如果p_base指向的是基类对象base,那么我们通过语句dynamic_cast<derived*>(p_base)得到的是一个NULL指针,我们可以通过判断转换后的指针是否为空,来决定是否调用派生类的成员,这样就会安全许多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值