【问题标题】:c++ derived class accessing base class' friend operatorsc++派生类访问基类的友元运算符
【发布时间】:2020-11-24 06:36:31
【问题描述】:

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

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++ inheritance operator-overloading iostream friend


    【解决方案1】:

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

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

    PS:你应该使用in而不是固定使用cin,并在operator&gt;&gt;中返回in

    【讨论】:

    • @OP,有没有想过为什么我们需要返回对象,即使你已经通过引用传递了它? (这只是供您思考的事情;))
    • 我知道这与类型转换有关,谢谢!这会永久改变对象的类型吗?这意味着我必须将其转换回其派生类?还是会是暂时的变化? @d4rk4ng31 有趣……是因为它变了吗?
    • @Diego,了解 C++ 中的左值和右值...提示,static_cast&lt;base&amp;&gt;(d) 是一个右值,您可以在 ctrl+click 的那一刻识别它,它会将您带到实际的功能来电。
    • 另外,不,你的猜测是错误的。我们将其退回以用于链接目的
    • @Diego 您不需要将其转换回来。转换只在in &gt;&gt; static_cast&lt;base&amp;&gt;(d);语句中生效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2021-06-21
    • 2012-02-12
    相关资源
    最近更新 更多