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

Virtual overloaded operators >> and <<

本文关键字:lt gt 虚拟 超载 运算符      更新时间:2023-10-16

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

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

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

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

在派生类中,该函数将被重写。

然后运算符<<可能看起来像

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

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