static_cast与dynamic_cast只知道是基类与派生类的转化关系,但具体是什么的?
派生类也包括基类部分,这说明派生类可以像基类一样在派生类对象上执行操作,因为派生类也有基类的性质,所以存在派生类引用到基类类型引用的类型转换,即可以将派生类的引用转化成基类子对象的引用。
基类类型的对象可以作为独立的对象存在,也可以作为派生类对象的一部分存在,因此一个基类对象可能是也可能不是一个派生类的一部分,所以没有基类引用到派生类引用的转换。
base *pb=new base;
derive *pd=dynamic_cast<derive*>(pd);编译正确,但是不安全
derive *pd1=ststic_cat<derive*>(pd);编译正确,运行正确
base *pb=new derive;
derive *pd=dynamic_cast<derive*>(pd);正确,并且安全
derive *pd=new base;//错,基类无法自动转换为派生类
derive *pd=new derive;
base *pb=pd;//可以自动转化
由此,可以注意到,转化只是基类到派生类的。
基类到派生类的转换
#include<iostream>
using namespace std;
class base
{
public:
base():i(0){cout<<"default constructor"<<endl;}
base(int i):i(i){std::cout<<"base constructor"<<endl;}
base& operator=(const base &right);
~base(){std::cout<<"base destructor "<<i<<endl;}
virtual void fun(){std::cout<<"fun in base "<<i<<endl;}
private:
int i;
};
base& base::operator=(const base &right)
{
cout<<"assignment in base"<<endl;
i=right.i;
return *this;
}
class derive:public base
{
public:
friend class buddy;
derive():j(0){cout<<"default constructor"<<endl;}
derive(int j):j(j){cout<<"derive constructor"<<endl;}
derive& operator=(const derive &right){cout<<"assignment in derive"<<endl;j=right.j;return *this;}
~derive(){cout<<"derive destructor "<<j<<endl;}
void fun(){cout<<"fun in derive "<<j<<endl;}
private:
int j;
};
class buddy
{
public:
void fun(){cout<<"fun in buddy"<<endl;}
};
int main()
{
base *pb=new base(2);
derive *pd=dynamic_cast<derive*>(pb);
pb->fun();
if(pd)
pd->fun();
else
cout<<"turn error"<<endl;
return 0;
}
int main()
{
base *pb=new base(2);
derive *pd=ststic_cast<derive*>(pb);
pb->fun();
if(pd)
pd->fun();
else
cout<<"turn error"<<endl;
return 0;}
结果说明:dynamic_cast依然是返回一个空指针以表示转换是不成立的;static_cast虽然不是空指针,但是结果不对,因为结果应该是"fun in derive ",因此也是转换失败