所以我有A类和B类,其中B类扩展了A类。我必须重载<<和>>在这两个班级。我希望在B类运算符的函数定义中,我可以调用A类的重载运算符,但是我很难这样做。
#include <iostream>
#include <string>
using namespace std;
class A {
friend ostream& operator<<(ostream& out, A a);
protected:
int i;
string st;
public:
A(){
i=50;
st = "boop1";
}
};
ostream& operator<<(ostream &out, A a) {
out << a.i << a.st;
return out;
}
class B : public A {
friend ostream& operator<<(ostream& out, B b);
private:
int r;
public:
B() : A() {
r=12;
}
};
ostream& operator<<(ostream &out, B b) {
out = A::operator<<(out, b); //operator<< is not a member of A
out << "boop2" << b.r;
return out;
}
int main () {
B b;
cout << b;
}
我尝试调用A的运算符版本&lt;&lt;在B的运算符版本&lt;&lt;,但它当然不属于A,所以无法编译。我该怎样实现这个目标?
另外,请注意,实际上A和B都有自己的标题和正文文件。
答案 0 :(得分:2)
A
的{{1}}确实不是 operator<<
的成员,而是在命名空间范围内。这里正确的方法是使用类型强制来让重载解析做正确的事情。变化:
A
为:
out = A::operator<<(out, b);
此外,您应该更改您的运算符以使用out << static_cast<A>(b);
取第二个参数,在这种情况下,它应该是以下内容以避免额外的副本:
const&
答案 1 :(得分:0)
它们是全局函数,不使用作用域解析运算符限定它们:
operator<<(out, static_cast<const A&>(b)) << "boop2" << b.r;
你必须抛出它,这样你就不会调用你所在的函数并获得无限递归。另外,请勿将operator<<
的结果分配给out
;它不起作用,这不是你想要做的。
此外,您的功能应该接受const A&
和const B&
(即,您应该通过const
引用接受参数,而不是值)以防止不必要的复制。