在C ++中继承友元运算符

时间:2012-09-21 00:03:08

标签: c++ inheritance operators

所以我有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都有自己的标题和正文文件。

2 个答案:

答案 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引用接受参数,而不是值)以防止不必要的复制。