什么是dynamic_cast static_cast

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值