虚拟重载运算符 >> 和 <<
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 >>
只是在这种情况下虚拟成员函数不会是常量..
我需要一个需要其子类重载 <<
和 >>
的接口,但我不太确定如何重载这些运算符,因为这些运算符没有作为成员函数重载:
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 >>
只是在这种情况下虚拟成员函数不会是常量..