继承operator +()

时间:2011-05-23 20:00:09

标签: c++ class operator-overloading

如何继承重载的operator +()?

例如,我有两个类:

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

operator +()返回Number。但我想这样做:

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

类型(firstNum + secondNum) - 数量&lt; 2,256&gt;不是宾。我必须在每个继承者中重载+()吗?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

在所有派生类中复制operator+的实现可能更容易。但是,如果您有冒险精神,可以使用curiously recurring template patternNumber模板类中强制执行类型一致性。

答案 2 :(得分:0)

无法做到,不能使运营商变为虚拟(即继承)。至少不是直接。

你可以这样做:

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

然后将addOp覆盖到您心中的内容。但是,您需要确保继承的任何内容都可以返回一个可用于其他任何内容的“Base”。这很快就会非常复杂。