c++向上转型与向下转型(dynamic_cast)
1.向上转型 定义: 向上转型是子类指针转换成父类指针 例如:
class parent { }; class son:public parent { };
Parent* p =new son(); //Son指针转换为Parent指针
向上转型是多态的基础,可以直接进行类型转换。 2. 向下转型 定义:父类指针向下进行类型转换成为子类指针 若直接进行向下转换(Son* s=new Parent())会因为指针步长的问题(将短指针赋值给长指针)而出现类型转换错误。 向下转型一般用于多态中的父类指针转向子指针。 因为在进行多态时,通常以父类指针指向子类指针,但是由于父类指针只能够操纵父类地址中的变量函数,子类中添加的变量函数被遗漏,如果想要操纵子类新添加的变量函数怎么办呢?这时就用到了向下转型,将指向子类空间地址的父类指针转换为子类指针,重新享有子类额外的变量函数地址。
//向下转型 Parent* pSon=new Son(); Son* s=dynamic_cast<Son*>(pSon); //若子类中新添函数myfunc() s->myfunc();
dynamic_cast
主要用于多态中类指针的向下转型,可以检测是否可以转型成功,或者说是否有继承关系,类似于java中的instanceof只能对有虚函数的指针进行转换 基本用法: dynamic_cast可以获取目标对象的引用或指针:
T1 obj;
T2* pObj = dynamic_cast<T2*>(&obj);//转换为T2指针,失败返回NULL
T2& refObj = dynamic_cast<T2&>(obj);//转换为T2引用,失败抛出bad_cast异常