向上强制转换和向下强制转换

在C++的继承中,基类和派生类的指针,引用的题目我们都见的很多。前面我也总结过基类指针和派生类指针调用函数的机制。

将派生类引用或指针转换为基类引用或指针被称为向上强制转换(upcasting)即基类指针指向了派生类对象,或者将派生类对象强制转换成了基类指针指向了

class Base
{
public:
    int b;
};
class Derive:public Base
{
public:
    int d;
};
int main()
{
    Base b;
    Derive d;
    Base *pb = &d;//向上强制转换
    pb->b = 1;  //可以赋值
    cout << "Base::b = " << pb->b << endl;
    return 0;
}

与向上强制转换相反,将基类指针或引用转换为派生类指针或引用成为向下强制转换。 
  如果不使用显示类型转换,向下强制转换是不允许的,因为is-a关系是不可逆的。 
  比如香蕉是水果,但是水果不是香蕉。 
  派生类香蕉可以新增数据成员,因此这些数据成员不能应用于基类水果,比如香蕉中有黄色,但是不是所有水果都是黄色的。

class Fruit
{
public:
    int weight;
};
class Banana:public Fruit
{
public:
    int yellow;
};
int main()
{
    Fruit b;
    Banana d;
    Banana *pb = &b;//隐式向下强制转换
    //报错
    Banana *p = (Banana*)&b;//显式类型转换,不会报错
    return 0;
}

 

转载于:https://www.cnblogs.com/mini-coconut/p/9277663.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值