虚拟重载运算符 >> 和 <<

3
我需要一个接口,要求它的子类重载 <<>>,但我不确定如何做到这一点,因为这些运算符不能作为成员函数重载。
std::istream& operator>> (std::istream& in, Student& student) {
    in >> student.name >> student.group;
    for (int& i : student.marks) { in >> i; }
    return in;
} 

也许有一种方法可以将它变成成员函数?

2
声明一个成员虚函数,例如 virtual std::ostream & out( std::ostream &os = std::cout ) const; 并在重载的运算符 << 的函数体内调用它。 - Vlad from Moscow
2个回答

10

你可以像这样做:

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& in) = 0 - Martian
1
@Ayxan 很好!谢谢。 - Martian

5
在这种情况下的一般方法是在基类中声明一个虚成员函数,例如:
virtual std::ostream & out( std::ostream &os = std::cout ) const;

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

然后操作符 << 可以看起来像:

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

可以类似地定义operator >>,但是在这种情况下,虚拟成员函数不会是常量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接