重载输入基类内部重载输入派生类

时间:2019-05-31 13:45:58

标签: c++ operator-overloading

我想重用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)时代码有什么问题?

2 个答案:

答案 0 :(得分:2)

为了获得Base的{​​{1}}部分,您需要转换为d
转换后得到的是一个临时Base&对象,该对象不能作为非常量引用参数传递。

请注意,此强制转换仍无法使一切正常工作,例如

Base

将使用Derived d; Base &b = d; std::cin >> b; 重载,因为重载基于Base&的静态类型。

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

<<

答案 1 :(得分:1)

这样做的时候

static_cast<Base>(d);

您将获得一个Base基值的d前值。您不能将其传递给

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

尽管它需要一个左值。您需要做的是获得对Base的{​​{1}}部分的引用,而不是像

d