1. 语法
static_cast < type-id > ( expression )
dynamic_cast <type-id > ( expression )
2. 用法
static_cast:
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成
派生类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
dynamic_cast:
①
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换,实际上只有在基类指针转换为子类指针是才有意义。
3.注意
为何使用dynamic_cast转换类指针时,需要虚函数呢?
因为派生类会继承基类的虚函数表,所以通过这个虚函数表,我们就可以知道该类对象的父类,在转换的时候就可以用来判断对象有无继承关系
4.实例
#include <iostream>
using namespace std;
class Base1
{
public:
virtual void f() { cout << "Base1::f" << endl; }
void f1(){cout << "Base1::f1" << endl;}
private:
double x;
double y;
};
class Derived1 : public Base1
{
public:
virtual void f(){cout << "Derived1::f" << endl; }
virtual void k(){cout << "Derived1::k" << endl; }
private:
double z;
};
void Test1()
{
// 对于单继承,
// 如果pD真的指向Derived1,用dynamic_cast和static_cast效果相同
Base1 *pD = new Derived1;
Derived1 *pD1 = dynamic_cast<Derived1*>(pD);
pD1->f();
pD1->k();
pD1->f1();
Derived1 *pD2 = static_cast<Derived1*>(pD);
pD2->f();
pD2->k();
pD2->f1();
// 但是如果pB1不是真的指向Derived1,则用dynamic_cast则返回NULL,能够更早的禁止error的发生,
// 如果用static_cast虽然返回的不为NULL,但是运行时可能抛出exception。
/**/ Error code
//Base1 *pB1 = new Base1();
//Derived1 *pD3 = static_cast<Derived1*>(pB1);
//pD3->f();
//pD3->k();
//pD3->f1();
//Derived1 *pD4 = dynamic_cast<Derived1*>(pB1);
//pD4->f();
//pD4->k();
//pD4->f1();
}
int _tmain(int argc, _TCHAR* argv[])
{
Test1();
system("pause");
return 0;
}