昨天在网易的笔试中又遇到了这个问题。这个问题主要考察的是对这两者在继承中的使用。
dynamic_cast:
基本用法
dynamic_cast可以获取目标对象的引用或指针:
T1 obj;
T2* pObj = dynamic_cast<T2*>(&obj);//转换为T2指针,失败返回NULL
T2& refObj = dynamic_cast<T2&>(obj);//转换为T2引用,失败抛出bad_cast异常
在使用时需要注意:被转换对象obj的类型T1必须是多态类型,即T1必须公有继承自其它类,或者T1拥有虚函数(继承或自定义)。若T1为非多态类型,使用dynamic_cast会报编译错误。下面的例子说明了哪些类属于多态类型,哪些类不是:
//A为非多态类型
class A{
};
//B为多态类型
class B{
public: virtual ~B(){}
};
//D为多态类型
class D: public A{
};
//E为非多态类型
class E : private A{
};//私有继承且A为非多态
//F为多态类型
class F : private B{
}//私有继承,但B多态
在多态类型间转换,分为3种类型:
1.子类向基类的向上转型(Up Cast)
2.基类向子类的向下转型(Down Cast)
3.横向转型(Cross Cast)
需要关注的是2和3。 2 中需要子类实现了基类的虚函数,而3中则需要2者继承于同一父类。
Static_cast
对于static_cast所需要的关系,"继承"绝对是其中之一,所以static_cast支持指向基类的指针和指向子类的指针之间的互相转换: