什么是dynamic_cast static_cast

来源:互联网 发布:怎么获取股票实时数据 编辑:程序博客网 时间:2024/06/04 00:51

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 ",因此也是转换失败




0 0
原创粉丝点击