在旧的转型中(cast)下面隐藏着一些不为见人的东西,它的语法形式使其在代码中不引起人的注意,以C语言中表达式加括号就是旧式转型    

    char *hopeItWork = (char *)0x00ff0000;

    C++采用函数形式转型语法来表达同样的意思

    C++中有四种新式转型符

    

    const_cast允许添加或移除表达式中的类型cast或volatile修饰符

    const Person *getEmeployee(){....}

    Person *anEmeployee = const_cast(getEmeployee());

    使用const_cast来剥夺getEmeployee()中返回值const修饰符,可以用旧式

    Person *anEmeployee = (Person *)(getEmeployee());

    (1)首先它看起来丑陋,醒目,因为任何形式的转找都是有危险的,这样写使人很容易注意到它

    (2)const_cast威力小,它只能改变修饰符

    比如上面的例子,const Emeployee *getEmeployee(){...}//返回类型改变了

    旧的转换符不会报错,但新的转换会报错,因为const_cast只允许改变修饰符,不允许改变它的类型

    

    static_cast操作符用于相对而言可跨平台的转型,它用于一个继承层次结构中基类的指针或引用,向下转换成派生类的指针或引用

    Shope *sp = new Circle;

    Circle *cp = static_cast(sp);//向下转型

    使用static_cast产生正确的代码,这是因为sp确实指向一个cp对像,然而如果sp指向其它shope的派生类,那么转换Cricle中就会报错

    注意static_cast中能转换const类型,这意味着有时要用俩种转换符来达到目的

    const Shop *sp = new Circle;

    Circle *cp = static_cast(const_cast(sp));


    reinterpret_cast的行为没有太多保证,它从bit的角度看待一个对像,允许将一个东西看作另一个完全不同的东西


    在类层次上谈转换有时要涉及到dynamic_cast,通常用于执行从基类指针安全向下转型指向派生类的指针,不同于static_cast,dynamic_cast仅用于多态类型进行向下转型(也就是说,被转型的表达示的类型,必须指向带有虚函数类类型的指针)并且执行检查来判断正确性

  Circle *cp = dynamic_cast (const_cast(getNextShape()));
        if (cp){....}
        如果getNextShape()返回一个指向Circle的指针或者Circle公有派生的东西,那么转型都是成功的. 习惯上对一个指针进行dynamic_cast等于在说"这个Shape指针真的是一个Circle吗,如果不是,我可以处理这种情况"