C++ 派生类访问基类的友元运算符

c++ derived class accessing base class' friend operators

提问人:Diego 提问时间:8/4/2020 更新时间:8/4/2020 访问量:229

问:

我正在处理运算符重载和继承。我目前有类似于以下代码的东西:

istream& operator >> (istream& in, derived& d)
{
   /* Some code asking for input to populate the object's data members*/
   cin >> d; /*Here, the operator called is this one, creating an infinite loop*/
}

基类有一个 istream >>运算符,当尝试调用它时,运算符实际上会调用自身,从而导致循环。如何从派生的算子访问基地的算子?

C++ 继承 运算符 - 重载 IOSTREAM 好友

评论


答:

2赞 songyuanyao 8/4/2020 #1

您需要将其转换为基类才能调用 on 基类,否则它会尝试调用自身并导致无限递归。例如operator>>

istream& operator >> (istream& in, derived& d)
{
    in >> static_cast<base&>(d);
    return in;
}

PS:你应该使用而不是固定使用,并返回 .incininoperator>>

评论

1赞 kesarling He-Him 8/4/2020
@OP,有没有想过为什么我们需要返回对象,即使你已经通过引用传递了它?(这只是你要思考的事情;) )
0赞 Diego 8/4/2020
我知道这与类型转换有关,谢谢!这会永久更改对象的类型吗?这意味着我必须将其转换回其派生类?还是暂时的改变?@d4rk4ng31 有趣的...是因为它变了吗?
1赞 kesarling He-Him 8/4/2020
@Diego,了解C++中的左值和右值...提示是一个右值,当你 Ctrl+单击时,你就会认出它,它会带你到它实际调用的函数。static_cast<base&>(d)
1赞 kesarling He-Him 8/4/2020
另外,不,你的猜测是错误的。我们出于链接目的将其退回
1赞 songyuanyao 8/4/2020
@Diego 您无需将其转换回来。转换仅在语句中生效。in >> static_cast<base&>(d);