#include <iostream>
#include <string>
using namespace std;
class B
{
public:
virtual void print()
{
cout<<"this is an object of class B"<<endl;
return ;
}
};
class D:public B
{
public:
virtual void print()
{
cout<<"this is an object of class D"<<endl;
return ;
}
};
int main()
{
// //const_cast
// const string cstr("hehe");
// cout<<cstr<<endl;
// string &str=const_cast<string&>(cstr);
// str="123";
// cout<<str<<endl;
// cout<<"cstr"<<cstr<<endl;
B b;
D d;
D *pd1=static_cast<D*>(&b);
pd1->print();
cout<<typeid(*pd1).name()<<endl;
D *pd2=dynamic_cast<D*>(&b);
cout<<typeid(pd2).name()<<endl;
((B*)(&d))->print();
system("pause");
return 0;
}
c++的4种转型,为了突出转型的动作。
const_cast<pointer/reference>(object pointer/reference) cast away the constness,消除object的const特性,将结果存入一个左值内,可以通过这个左值来修改object了,但是本身仍然是无法修改。
dynamic_cast<pointer/reference>(object pointer/reference) safe downing cast,安全向下转型,将基类对象的指针或者引用转成派生类的,如果本身是派生类对象(polymorphism),就很稳定,如果本来只是一个基类的指针或者引用,使用static_cast代替,取得的结果会是基类对象指针或者引用,但是用dynamic_cast取得无效的指针(NULL)或者无的引用,这是由于使用了运行时类型识别来判断转型,所以称为安全转型。
reinterpret_cast<>() 按位转型,比较低级!不谈,因为我也不太会,抹除了本身的意义。
static_cast<>() 隐式类型转换。一般的c的old-style conversion都是可以用这个。