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

Virtual overloaded operators >> and <<

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

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

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

你可以这样做:

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; }
    }
};

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

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

在派生的 classes 中,函数将被覆盖。

那么运算符<<可以看起来像

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

类似的方法可以定义operator >>只是在这种情况下虚拟成员函数不会是常量..