C ++中的运算符重载和多态

SP5RFD

我正在为C ++中的基本数字类型编写一个简单的包装。

我想要一个抽象的基类Number和一些派生类,例如Short,Integer,Long和Double。

为了使Number类成为抽象类,我需要声明一些对于所有数字类型都通用的纯虚方法,例如基本运算符(+,-,*,/):

class Number {
    public:
    [...]
        virtual Number operator+(Number) = 0;
        virtual Number operator-(Number) = 0;
        virtual Number operator*(Number) = 0;
        virtual Number operator/(Number) = 0;
    [...]
}

但是,当我尝试在派生类中使用具体类型的操作符来实现该操作符时,恐怕这将无法正常工作:

class Integer : public Number {
    public:
    [...]
        Integer operator+(Integer);
        Integer operator-(Integer);
        Integer operator*(Integer);
        Integer operator/(Integer);
    [...]
}

当我尝试编译此代码时,我收到以下消息:

Number.hpp错误:无法将参数“ anonymous”声明为抽象类型“ Number”注意:因为以下虚拟函数在“ Number”中是纯净的:注意:虚拟Number Number :: operator +(Number)

我敢肯定我可以做到,但是到目前为止我还不知道怎么做。你能帮我一下吗?;)

sp2danny

1)由于Number是抽象的,因此您必须返回一个引用(或指针)
2)参数也必须是引用(相同的原因)
3)派生类的参数必须相同
4)您缺少“虚拟”覆盖

这是一种可行的技巧:

class Number {
    public:
        virtual Number& operator+(const Number&) = 0;
};

class Integer : public Number {
    public:
        virtual Integer& operator+(const Number&) override;
    private:
        int i;
};

Integer& Integer::operator+(const Number& n)
{
    static Integer i;
    const Integer* param = dynamic_cast<const Integer*>(&n);
    assert(param);
    i.i = this->i + param->i;
    return i;
}

注意,在某些情况下,返回对静态变量的引用会使您感到惊讶,请参阅注释。
另外,多态可能不是最适合您尝试做的事情,例如,
您是否真的需要跟踪数字,而又不知道数字是什么类型?

如果您真的想在这里使用多态,则智能指针可能应该与解决方案一起提供

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章