#include <iostream>
using namespace std;
class color
{
public:
virtual void f()
{
cout << "color::f()" << endl;
}
};
class red : public color
{
public:
void f()
{
cout << "red::f()" << endl;
}
};
class blue : public color
{
public:
void f()
{
cout << "blue::f()" << endl;
}
};
class other
{
public:
virtual void f()
{
cout << "other::f()" << endl;
}
};
int main() {
color *pc;
red red;
pc = &red;
blue* pb_dynamic = dynamic_cast<blue*>(pc);
blue* pb_static = static_cast<blue*>(pc);
cout << "pb_dynamic: " << pb_dynamic << endl;
cout << "pb_static: " << pb_static << endl;
//pb_dynamic->f(); //pc绑定的是red而不是blue,pb_dynamic为0,调用此句会失败
pb_static->f(); // pc绑定的是red而不是blue,static_cast不识别这些, 而是当做red的函数来处理!
other* _other = new other();
blue* pbo_dynamic = dynamic_cast<blue*>(_other);
blue* pbo_static = static_cast<blue*>(_other);
cout << "pbo_dynamic: " << pbo_dynamic << endl;
cout << "pbo_static: " << pbo_static << endl;
//pbo_dynamic->f(); //pc绑定的是red而不是blue,pb_dynamic为0,调用此句会失败
pbo_static->f(); // pc绑定的是red而不是blue,static_cast不识别这些, 而是当做red的函数来处理!
return 0;
}
总结:static_cast字面意思是静态转换,编译期间就能判断是否可以转换成功,但是无法识别兄弟指针之间的转换(先提升一个兄弟(red)指针为父指针(color),再向下转换(blue))而dynamic_cast是运行时转换,可以编译通过,但是可以与NULL指针的比较来判断是否转换成功!