在 C++ 中重载 parent 和 child class 中的 + 和 += 运算符

Overloading + and += operators in parent and child class in C++

好吧伙计们,这个让我很困惑,尤其是因为网上关于这个的信息太少了……

好吧,假设我有一个 parent 和一个 child class 这样的:

   class ParentPlot
   {
      public:
         int a; 
         int b;
         datacontainer Events;


         friend ParentPlot& operator+(ParentPlot& plotA, const ParentPlot& plotB)
         {
            //add stuff
            return sumPlot;
         }
         virtual ParentPlot operator+=(const ParentPlot &plotB)
         {
            //+= stuff using 'this'
            return *this;
         }
   }

   class ChildPlot: public ParentPlot
   {
      public:
         int q;

      friend ChildPlot& operator+(ChildPlot& plotA, const ChildPlot& plotB)
         {
             //Static cast and add the parents.
            ParentPlot PlotACast = static_cast<ParentPlot>(plotA); //2 Static casts
            ParentPlot PlotBCast = static_cast<ParentPlot>(plotB);
            ParentPlot ParentSum = PlotACast + PlotBCast; //Add as ParentPlots
            ChildPlot BasePlot = ChildPlot(ParentSum);

            //Add child members
            BasePlot.q = plotA.q + plotB.q;

            return BasePlot;
         }
      ChildPlot& operator+=(const ChildPlot& plotB)
      {
          //How do I correctly implement this?
      }
   }

我应该如何正确管理这些 classes 的加法和 +=?每个组合似乎都会出现某种错误,我无法让它工作。例如上面实现的方法给出了以下错误:

“此运算符函数的参数太少”

我试过使 ParentPlot 成为抽象的 class 然后在 child class 中实现,但是加法运算符中断,因为我不能 return a parent 在加法运算符中。

从技术上讲,ParentPlot 将是抽象的,但会有许多 children 需要求和,并且它有多个成员。我不应该为 parent 而只为 children 实现加法运算符或 += 还是我遗漏了什么?真的不知道处理这个问题的正确方法。任何想法都会有所帮助...

谢谢

1。修复您的运算符 return 类型。

operator +应该return一份。 operator += 应该 return 引用 this.

friend ParentPlot operator+(ParentPlot& plotA, const ParentPlot& plotB)
ParentPlot& operator+=(const ParentPlot &plotB)
friend ChildPlot operator+(ChildPlot& plotA, const ChildPlot& plotB)
ChildPlot& operator+=(const ChildPlot& plotB)

2。使用 operator +=

实现您的 operator +

这个小技巧可以使您的代码变干,并且可以更轻松地实现这些额外的运算符。
请注意,第一个参数是按值获取的,我们需要一个将由 operator +=.

修改的副本
friend ParentPlot operator+(ParentPlot plotA, const ParentPlot& plotB)
{
    return plotA += plotB;
}

friend ChildPlot operator+(ChildPlot plotA, const ChildPlot& plotB)
{
    return plotA += plotB;
}

3。实施子 operator +=

假设您已经有 operator += 用于 ParentPlot,您可以通过两种方式使用它:

static_cast<ParentPlot&>(*this) += plotB;
//or
ParentPlot::operator+=(plotB);

然后像往常一样添加特定于儿童的实现和 return *this;

完整代码(see it online):

class ParentPlot {
public:
    int a;
    int b;

    friend ParentPlot operator+(ParentPlot plotA, const ParentPlot& plotB)
    {
        return plotA += plotB;
    }
    ParentPlot& operator+=(const ParentPlot& plotB)
    {
        a += plotB.a;
        b += plotB.b;
        return *this;
    }
};

class ChildPlot : public ParentPlot {
public:
    int q;

    friend ChildPlot operator+(ChildPlot plotA, const ChildPlot& plotB)
    {
        return plotA += plotB;
    }
    ChildPlot& operator+=(const ChildPlot& plotB)
    {
        //static_cast<ParentPlot&>(*this) += plotB;
        ParentPlot::operator+=(plotB);
        q += plotB.q;
        return *this;
    }
};