继承运算符 +()

Inheriting operator +()

本文关键字:运算符 继承      更新时间:2023-10-16

如何继承重载运算符+()?

例如,我有两个类:

class Bin : public Number<2, 256>
{
public:
    Bin(const char* number = NULL) :
        Number(number)
    {}
};

template <unsigned int BASE, unsigned int ORDER>
class Number
{
private:
    ...
public:
    Number(const char* number = NULL) {
        ...
    }
    const Number& operator +=(const Number& number) {
        ...
    }
    Number operator +(const Number& number) const {
        Number result = *this;
        return result += number;
    }
};

运算符 +() 返回数字。但我想做:

Bin firstNum("101010111010");
Bin secondNum("1101011101");
Bin result = firstNum + secondNum;

类型 (firstNum + secondNum) - Number<2, 256> 不是 Bin。我必须在每个继承器中重载 +() 吗?

考虑在比你的稍微复杂的示例中需要发生什么,其中派生类Bin有自己的成员变量。 基类函数怎么可能知道该怎么做才能创建返回值? 它在"混合模式"添加中会做什么? (例如,如果一个参数是Bin,另一个参数是Blah)。

所以是的,您需要在您想要特定行为的任何地方定义特定的运算符。 请注意,这不仅适用于重载运算符,也适用于一般成员函数。

在所有

派生类中复制operator+的实现可能会更容易。 但是,如果您喜欢冒险,则可以使用奇怪的重复模板模式来强制Number模板类中的类型一致性。

不能做,运算符不能成为虚拟的(即继承的)。 至少不是直接的。

您可以这样做:

class Base {
public:
   Base operator+(const Base& addend) { return addOp(addend) ; }
private:
   virtual Base addOp(const Base& addend) ;
} ;

然后覆盖 addOp 到您喜欢的内容。 但是,您需要确保任何继承的内容都可以返回可与其他任何内容一起使用的"Base"。 这很快就会变得非常复杂。