由于友元不是成员函数,所以不能使用作用域解析操作符来指出要使用哪个函数。解决方法是使用强制类型转换,以便匹配原型时能够选择正确的函数。
基类:
class class_a
{
private:
int x;
public:
...
friend std::ostream & operator<<(std::ostream & os,const class_a & rs);
...
};
std::ostream & operator<<(std::ostream & os,const class_a & rs)
{
os<<"class_a: "<<rs.x<<std::endl;
return os;
}
派生类
class class_b:public class_a
{
private:
int b;
public:
...
friend std::ostream & operator<<(std::ostream & os,const class_b & rs);
...
};
std::ostream & operator<<(std::ostream & os,const class_b & bs)
{
os<<"class_a: "<<(const class_a &) bs;
os<<"class_b b: "<<bs.b<<std::endl;
return os;
}
可以理解为,友元函数重载,通过强制类型转换参数来匹配函数特征标,续而调用正确的函数。