C++ 重载纯虚拟操作符

C++ 重载纯虚拟操作符,c++,operator-overloading,abstract-class,derived-class,pure-virtual,C++,Operator Overloading,Abstract Class,Derived Class,Pure Virtual,我有一个抽象类Number和4个纯虚拟操作符(+,-,/,*)。我想创建两个派生类Integer和Real,并在那里重写这些运算符。我不太明白如何声明运算符。我在网上没有找到任何类似我的情况的例子 我的问题是: 在抽象基类Number中,我的运算符必须返回引用Number&或指针Number*,因为我不能返回抽象类本身。但我应该传递什么作为论点呢Number&或Number*也是,但我需要在类中存储Number,我的基类中是否应该有类似void*num的内容? 让我们想象一下,我有 class

我有一个抽象类
Number
和4个纯虚拟操作符(
+
-
/
*
)。我想创建两个派生类
Integer
Real
,并在那里重写这些运算符。我不太明白如何声明运算符。我在网上没有找到任何类似我的情况的例子

我的问题是: 在抽象基类
Number
中,我的运算符必须返回引用
Number&
或指针
Number*
,因为我不能返回抽象类本身。但我应该传递什么作为论点呢
Number&
Number*
也是,但我需要在类中存储Number,我的基类中是否应该有类似
void*num
的内容? 让我们想象一下,我有

class Number {
    ...
    virtual Number& operator+(const Number&) = 0;
};
如何在派生类
Integer
中重写此运算符

我知道,但我的导师坚持要像在抽象类中练习一样覆盖纯虚拟操作符,但我真的不明白

你可以从中了解到两件事:

  • 虚拟函数通常是如何工作的(自定义运算符只是普通函数,只是调用语法不同而已)
  • 虚拟函数不是解决任何问题的圣杯
  • 问题是类
    Integer
    Real
    最有可能具有不同的内部表示形式–因此您将无法执行加法/乘法/。。。不知道作为第二个操作数接收的具体类型。此外,混合操作数类型的返回类型应该是什么还很不清楚

    我真的不需要atm来添加real+int,只需要real+real,int+int

    好吧,我们可以看到:

    class Number
    {
    public:
        virtual ~Number() { } // in any case, a virtual base class should have a virtual destructor!
    
        // fine so far:
        virtual Number& operator+(Number const&) const = 0;
        // we are not going to change the          ^
        // own instance, so we'd rather have this operator const
        // (in contrast to operator+=)
    };
    
    class Integer : public Number
    {
    public:
        Integer& operator+(Number const& other) const override
        // ^ co-variant return type, so that's fine
        {
            // at very first, we make sure that we actually received
            // an instance of type Integer
            auto o = dynamic_cast<Integer const*>(&other);
            if(!o)
                // if not, throwing an exception is a good candidate
                // for error handling...
                throw std::invalid_argument("argument must be of type Integer");
    
            // now as we know it IS an Integer:
            return Integer(this->value + o->value); // or whatever...
            // OOPS - the returned object gets lost when the function is left...
        }
    };
    

    这个问题再次说明了所选择的方法实际上是多么不合适…

    假设您有这个类层次结构,您能举个例子说明如何使用它吗?现在还不清楚你到底想要得到什么。@Evg-hm,类似于简单的自定义int类。不确定你的设计是否正确。。。您需要能够以这种方式添加
    整数
    s和
    实数
    s–但除非您有一些数字的通用表示法,否则您需要了解类型。。。另一方面,如果您有这样的通用表示,那么为什么不在数字基类中使用呢?可能重复“我并不真的需要atm来添加real+int-only real+real,int+int”的说法,那么为什么要首先考虑虚拟方法或继承呢?您不需要从基类继承
    Integer
    Real
    就可以启用
    Integer+Integer
    Real+Real
    语句的较温和版本是“虚拟函数不是解决所有问题的圣杯”,虽然我完全同意你写的:)你在这里返回了一个悬而未决的参考。一个可能的解决方案是返回
    std::unique_ptr
    @Evg Damn,当然可以。完全不使用返回引用的运算符。。。再次证明了强加的概念是多么糟糕。上帝保佑你们,小伙子们。@Evg绝对。今天似乎没有注意到:(
    class Number
    {
        virtual std::unique_ptr<Number> operator+(Number const&) const = 0;
    };
    
    class Integer : public Number
    {
        std::unique_ptr<Number> operator+(Number const& other) const override
        //                 ^
        // unfortunately, now, as ordinary struct, no co-variance possible any more
        {
            return std::make_unique<Integer>(this->value + o->value);
        }
    };