如何继承重载的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;不是宾。我必须在每个继承者中重载+()吗?
答案 0 :(得分:1)
考虑在比你更复杂的例子中需要发生什么,派生类Bin
有自己的成员变量。基类函数怎么可能知道要做什么来创建返回值?它会在“混合模式”的添加中做些什么呢? (例如,如果一个参数是Bin
,另一个参数是Blah
)。
所以是的,你需要在任何你想要特定行为的地方定义特定的运算符。请注意,这不仅适用于重载运算符,还适用于成员函数。
答案 1 :(得分:1)
在所有派生类中复制operator+
的实现可能更容易。但是,如果您有冒险精神,可以使用curiously recurring template pattern在Number
模板类中强制执行类型一致性。
答案 2 :(得分:0)
无法做到,不能使运营商变为虚拟(即继承)。至少不是直接。
你可以这样做:
class Base {
public:
Base operator+(const Base& addend) { return addOp(addend) ; }
private:
virtual Base addOp(const Base& addend) ;
} ;
然后将addOp覆盖到您心中的内容。但是,您需要确保继承的任何内容都可以返回一个可用于其他任何内容的“Base”。这很快就会非常复杂。