继承运算符 +()
Inheriting 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;
}
};
运算符 +() 返回数字。但我想做:
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"。 这很快就会变得非常复杂。
相关文章:
- 通过继承类使用来自不同命名空间的运算符
- 运算符继承和 cpp 核心准则 c.128 的问题
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 继承模板化转换运算符
- C++ 继承运算符=
- 在继承的模板类中使用下标 [] 运算符
- 如何调用继承的重载运算符<<并在派生类的输出中添加更多文本?
- C++模板化类上继承的运算符'<<'
- 类继承和运算符重载
- 通过继承重载运算符会导致歧义
- 使用继承的指针列表复制构造函数或重载运算符=
- C++中移动赋值运算符的继承
- 如何在C++上的多个继承上下文上使用特定基类中的运算符
- 继承类中的比较运算符
- 继承 C++14 中的模板化运算符 =:g++ 和 clang++ 的不同行为
- 具有继承的未声明标识符(运算符 ostream)
- 如何使用运算符编写可继承的模板类
- C++运算符继承和重载
- 重载的强制转换运算符继承(Visual C++)
- 赋值运算符继承