【问题标题】:Operator overloading in pure virtual classes [closed]纯虚拟类中的运算符重载[关闭]
【发布时间】:2014-06-29 18:41:58
【问题描述】:

您好,我正在尝试为原始类型创建类似包装类的东西,但我被困在这个问题上:

当我尝试创建接口并能够对后代使用多态性时

编辑

我来了

function returning abstract class "Var" is not allowed: 
function "Var::operator+" is a pure virtual 
function function "Var::operator-" is a pure virtual function 
function "Var::operator*" is a pure virtual function 
function "Var::operator/" is a pure virtual function

这是我的代码

class Var
{

public:
    Var() {  }
    virtual Var operator+(Var b) = 0;
    virtual Var operator-(Var b) = 0;
    virtual Var operator*(Var b) = 0;
    virtual Var operator/(Var b) = 0;
};

class Decimal : public Var
{

public:
    Decimal(double a) { value = a; }
    Decimal() : Decimal(0) {  };
    virtual Decimal operator+( Decimal b)
    {
        return value + b.value;
    }
    virtual Decimal operator-( Decimal b)
    {
        return value - b.value;
    }
    virtual Decimal operator*( Decimal b)
    {
        return value * b.value;
    }
    virtual Decimal operator/( Decimal b)
    {
        return value / b.value;
    }
    Decimal operator=(double val)
    {
        value = val;
    }

private:
    double value;
};

我的问题有什么解决办法吗?

【问题讨论】:

  • “大量错误”对你想帮助你的人没有帮助。
  • 为了覆盖基类的函数,成员函数必须与参数列表完全匹配并且具有协变返回类型。
  • 另外,value + b.value 等会生成 Var,但您的返回类型(当前)是 Decimal,因此必须进行从 VarDecimal 的转换(但添加一个是一个相当糟糕的主意)。
  • 参数类型需要相同。试试const Var&,否则你传递了一个Var的副本,Var不能被实例化。
  • @nikolap 像往常一样,您被要求发送至add such information to your question。请这样做,在 cmets 中它并不是真的有用(考虑不存在的信息)。

标签: c++ operator-overloading pure-virtual


【解决方案1】:

我认为你的做法是错误的。试试模板

template<class T>
class Var
{
public:
    typedef T Type;

    Var(const Type& value = Type()) : value(value) {}

    friend Var operator+(const Var& left, const Var& right)
    {
        return Var(left.value + right.value);
    }

private:
    Type value;
};

【讨论】:

    猜你喜欢
    • 2019-10-21
    • 1970-01-01
    • 2011-09-08
    • 2012-12-02
    • 1970-01-01
    • 2021-11-12
    • 2020-09-20
    • 1970-01-01
    相关资源
    最近更新 更多