首页 > 解决方案 > 在重载输入派生类中重载输入基类

问题描述

我想重用Base类内部Derived类的重载输入函数。

class Base
{
private:
    int m_value;

public:
    Base(int value)
        : m_value(value)
    {
    }

    friend std::istream& operator>> (std::istream &in,Base &b)
    {

        in>>b.m_value;
        return in;
    }
};

class Derived : public Base
{
    std::string id;
public:
    Derived(int value,std::string id)
        : Base(value),id(id)
    {
    }

    friend std::istream& operator>> (std::istream &in,Derived &d)
    {
        in>>static_cast<Base>(d);//not work
        in>>d.id;
        return in;
    }
};

我写的代码有什么问题in>>static_cast<Base>(d)

标签: c++operator-overloading

解决方案


为了获得 的Base部分d,您需要转换为Base&
你的演员得到的是一个临时Base对象,它不能作为非常量引用参数传递。

请注意,此演员阵容仍然无法使一切都按您的预期工作——例如,

Derived d;
Base &b = d;
std::cin >> b;

将使用Base&重载,因为重载是基于b.

>>对层次结构重载(and ) 的一种常见方法<<是只有一个重载,它只是委托给一个虚拟成员函数。
然后,您可以覆盖派生类中的成员函数,并让动态调度负责选择适当的函数。

struct Base
{
    virtual void read(std::istream& is) { ... }
};

std::istream& operator>> (std::istream &in, Base &b)
{
    b.read(in);
    return in;
}

struct Derived: Base
{
    void read(std::istream& is) override { Base::read(is); ... }
};

推荐阅读