【问题标题】:Unclear how to implement operator overloading in a class derived from an abstract base class不清楚如何在从抽象基类派生的类中实现运算符重载
【发布时间】:2024-03-08 18:45:01
【问题描述】:

我们的教授对此非常不清楚,所以我希望我对此不要太含糊。基本上我们需要编写一个抽象基类,其他(非抽象)类继承自该抽象基类,抽象基类的头文件如下所示:

//AbstractBase.h 
class AbstractBase
{
    public:
        AbstractBase();
        virtual int operator+ (int)=0;
}

我不知道在实现 .cpp 文件中放什么,因为它是一个抽象类(所以你不能从那个类创建任何对象,我可能在这里非常非常错误)所以我只是没有做一个。

然后是带有头文件的派生类和实现如下:

//Headerfile for DerivedClass
#include "AbstractBase.h"
class DerivedClass: public AbstractBase
{
    public:
        DerivedClass(double &);
        DerivedClass * operator+ (DerivedClass*);
        double getVar();
        void setVar(double)
    private:
        double Var;
}

//Implementation of DerivedClass
#include "DerivedClass.h"
class DerivedClass::DerivedClass(double &Input) :Var(Input)
{}

double DerivedClass::getVar()
{
    return Var;
}

void DerivedClass::setVar(double Input)
{
    Var=Input;
}

DerivedClass * DerivedClass::operator+ (DerivedClass * object)
{
    double Sum;
    Sum=Var+object->getVar()
    DerivedClass result(Sum);
    return result;
}

所以我的问题归结为:

  • 重载部分(最后几行)应该执行以下操作:当我添加 DerivedClass 类的两个对象,它应该只添加私有 变量(双变量)在一起。我已经做了一些搜索,但是 无法立即找到我可以使用的东西(也许是因为 我对此事的了解有限)。

一个小问题:

  • 如何处理 AbstractBase 类?我的任务描述状态 它应该只包含 4 个虚函数 重载运算符。但它是一个抽象基类,我没有 还知道我将如何使它们超载(即,就像说“添加两个 东西,我不知道怎么做,但我知道你可以把它们加起来……”,就是这样 所有抽象类都说)

编辑:关于我认为应该如何发生的一些说明。

抽象基类包含一个虚函数operator+。在派生类中,我定义了一个新的 operator+,它知道如何处理派生类对象的添加。如果我使用 DerivedClass* 类型的指针,它将忽略虚函数并使用 DerivedClass 中定义的 operator+ 函数(虚函数的基本原理?)。问题似乎派生类仍然被视为抽象类,所以我不能使用组件 10 提供的代码,因为它实例化了 DerivedClass 的对象(这是不可能的,因为它显然是抽象的)

编辑2:

我们的教授决定省略运算符重载,因为它涉及的代码太复杂:D 无论如何感谢您的帮助,我确实学会了如何正确实现它(有点)。

【问题讨论】:

  • 你的教授希望你重写这个 virtual int operator+ (int)=0;,而不是编写你自己的 operator+。我可能也错了。我相信这就是从抽象基类继承的全部意义。

标签: c++ operator-overloading abstract-class


【解决方案1】:

您的要求有点令人困惑。假设你的基类是正确的,你需要一个构造函数,因为你已经声明了一个:

AbstractBase::AbstractBase() {}

这里不需要实现operator+。我不确定您对派生的 operator+ 有何看法,但它可能如下所示:

DerivedClass DerivedClass::operator+ (const DerivedClass& rhs)
{
    return DerivedClass(Var + rhs.Var);
}

不过,这不会覆盖您的基础 operator+ (int)

这样做的目的是为了演示虚函数还是运算符重载?不管怎样,我认为你需要让你的教授清楚他们在寻找什么。

【讨论】:

  • 目的是计算耦合双摆的混沌行为:D 所以我需要编写一个抽象类 ODEProblem,它有 4 个重载运算符和一个继承类 Pendulum,您可以在其中添加对象钟摆类以这样的方式产生一个新对象,该对象具有私有数据成员,这些私有数据成员是原始 2 个对象的总和(因此是一种花哨的向量)。
  • 还有返回类型呢?如果我使用它,我会收到错误“不允许返回抽象类 DerivedClass 的函数”。
  • @PatronBernard:那是因为在返回时它试图实例化DerivedClass 类型的对象,而编译器认为DerivedClass 是抽象的。猜测一下,我会说这是因为您还没有实现在“DervcedClass”的基类中声明的virtual int operator+ (int)=0; 纯虚函数。除非您在派生类中实现所有基类纯虚拟,否则您将无法实例化它,您所能做的就是从它派生。
最近更新 更多