【问题标题】:Virtual overloaded operators >> and <<虚拟重载运算符 >> 和 <<
【发布时间】:2020-09-20 06:33:40
【问题描述】:

我需要一个需要其子类重载 &lt;&lt;&gt;&gt; 的接口,但我不太确定如何因为这些运算符没有作为成员函数重载:

std::istream& operator>> (std::istream& in, Student& student) {
    in >> student.name >> student.group;
    for (int& i : student.marks) { in >> i; }
    return in;
} 

也许有办法让它成为成员函数?

【问题讨论】:

  • 声明一个成员虚函数,例如 virtual std::ostream & out( std::ostream &os = std::cout ) const;并在重载运算符 的主体内调用它

标签: c++ class operator-overloading virtual function-definition


【解决方案1】:

你可以这样做:

class StudentInterface
{
public:
    virtual void readSelfFrom(std::istream& in) = 0;
};

std::istream& operator>> (std::istream& in, StudentInteface& student) 
{
    student.readSelfFrom(in);
    return in;
} 

然后让用户从StudentInterface派生,例如:

class Student: public StudentInterface
{
public:
    void readSelfFrom(std::istream& in) override
    {
        in >> name >> group;
        for (int& i : marks) { in >> i; }
    }
};

【讨论】:

  • Student其实是应该派生出来的,所以我想我留下virtual void readSelfFrom(std::istream&amp; in) = 0
  • @Ayxan 不错!谢谢。
【解决方案2】:

这种情况下的一般方法是在基类中声明一个虚拟成员函数,如

virtual std::ostream & out( std::ostream &os = std::cout ) const;

在派生类中,该函数将被覆盖。

那么操作符

std::ostream & operator <<( std::ostream &os, const Base &obj )
{
    return obj.out( os );
}

类似的方式可以定义operator &gt;&gt;,只是在这种情况下,虚成员函数不会是常量..

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 2021-11-12
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多