c++中的操作符重载和多态性

Operators overloading and polymorphism in C++

本文关键字:多态性 重载 操作符 c++      更新时间:2023-10-16

我正在用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 '中是纯的:备注:virtual Number Number::operator+(Number)

我确信我能做到这一点,但到目前为止我还不知道怎么做。你能帮我一点忙吗?div;)

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;
}

注意,在某些情况下,返回对静态对象的引用可能会让您感到惊讶,请参阅注释。
另外,多态性可能不是最适合您要做的事情,例如,
你真的需要记录那些你不知道它们是什么类型的数字吗?

如果你真的想要多态性,智能指针可能应该伴随解决方案