C++ 多态(四)动态转换

C++ 多态(四)动态转换

Dynamic casting


概述

在处理多态性时,您经常会遇到这样的情况:您有一个指向基类的指针,但您希望访问只存在于派生类中的一些信息。

考虑以下程序:

#include <iostream>
#include <string>
 
class Base
{
protected:
    int m_value;

public:
    Base(int value): m_value(value)
    {}
        
    virtual ~Base(){};
};

class Derived : public Base
{
protected:
    std::string m_name;
 
public:
    Derived(int value, const std::string& name)
        : Base(value), m_name(name)
    {}

    const std::string& getName() const
    { 
        return m_name; 
    }
};
 
Base* getObject(bool bReturnDerived)
{
    if (bReturnDerived)
        return new Derived(1, "Apple");
    else
        return new Base(2);
}
 
int main()
{
    Base *b = getObject(true);

    // 只有一个Base指针,我们如何打印派生对象的名称在这里?
    delete b;

    return 0;
}

在这个程序中,函数 getObject() 总是返回一个 Base 指针,但该指针可能指向 Base 对象或派生对象。在指针指向派生对象的情况下,我们如何调用派生 ::getName()?

一种方法是向 Base 添加一个名为 getName() 的虚函数(这样我们就可以使用 Base 指针/引用来调用它,并让它动态解析为 Derived::getName())。但是如果你用 Base 指针/引用调用它它实际上指向一个 Base 对象,这个函数会返回什么? 没有任何有意义信息。此外,我们会用实际上只应该是派生类所关心的东西污染基类。

我们知道 C++ 将隐式地允许您将派生指针转换为基指针(实际上,getObject() 就是这样做的)。这个过程有时被称为上抛。但是,如果有一种方法可以将基指针转换回派生指针呢?然后,我们可以直接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大鹏068

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值