用户名: 密码: 忘记密码? 注册

dynamic_cast 操作符

作者:  时间: 2011-01-05
我觉得c++提供的四个强制类型转换操作符中最有意思的就要数dynamic_cast,其他三个非常简单,不作赘述!

    dynamic_cast 将基类类型的指针或引用转换为同一继承层次中其他类型的引用或指针,与其他的强制类型转换不同的是,dynamic_cast涉及运行时类型检查,如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败,如果转换指针类型的dynamic_cast失败,则dynamic_cast的值为0, 如果转换引用类型的dynamic_cast失败,则抛出一个bad_cast类型的异常
    因此dynamic_cast操作符其实执行两个动作,首先检查转换是否有效,如果无效则进行错误处理,如果有效,进行转换

#include <iostream>
#include <typeinfo>

using namespace std;

class A
{
public:
    virtual void func()
    {
        cout<<"A function"<<endl;
    }

};

class B : public A
{
public:
    virtual void func()
    {
        cout<<"B function"<<endl;
    }
};



指针转换

int main(int argc, char *argv[])
{
    A *pa = new B;
    //A *pa = new A; // error

    if(B* pb1 = dynamic_cast<B*>(pa))
    {
        pb1->func();
    }
    else
    {
        cout<<"convert failed\n";
    }

    return 0;
}


引用转换

int main(int argc, char *argv[])
{
    B b;
    //A b; // error

    A &ra = b;

    try{
        B &rb = dynamic_cast<B&>(ra);
        rb.func();
    }
    catch(bad_cast &ba)
    {
        cout<<"convert failed\n";
    }

    return 0;
}