C++ 继承运算符+;()
如何继承重载运算符+() 例如,我有两门课:C++ 继承运算符+;(),c++,class,operator-overloading,C++,Class,Operator Overloading,如何继承重载运算符+() 例如,我有两门课: class Bin : public Number<2, 256> { public: Bin(const char* number = NULL) : Number(number) {} }; 类型(firstNum+secondNum)-编号不是Bin。必须在每个继承器中重载+()吗?不能这样做,不能将运算符设置为虚拟的(即继承的)。至少不是直接的 您可以这样做: class Base { publi
class Bin : public Number<2, 256>
{
public:
Bin(const char* number = NULL) :
Number(number)
{}
};
类型(firstNum+secondNum)-编号不是Bin。必须在每个继承器中重载+()吗?不能这样做,不能将运算符设置为虚拟的(即继承的)。至少不是直接的 您可以这样做:
class Base {
public:
Base operator+(const Base& addend) { return addOp(addend) ; }
private:
virtual Base addOp(const Base& addend) ;
} ;
然后将addOp覆盖到您的心满意足。但是,您需要确保继承的任何内容都可以返回一个“Base”,该“Base”将与其他内容一起使用。这很快就会变得非常复杂。考虑一下在一个比您的示例稍微复杂一些的示例中需要发生什么,其中派生类
Bin
有自己的成员变量。基类函数如何知道如何创建返回值?在“混合模式”中它会做什么?(例如,如果一个参数是Bin
,另一个是Blah
)
因此,是的,您需要在需要特定行为的任何地方定义特定的运算符。请注意,这不仅适用于重载运算符,也适用于一般的成员函数。在所有派生类中复制
运算符+
的实现可能更容易。但是,如果您喜欢冒险,可以使用来在Number
模板类中强制实现类型一致性 请注意,此问题并非特定于操作员+
,甚至不是一般操作员。对于“普通”成员函数也是如此……当添加两个派生类时,可能会产生一个Base
。如果我想为每个派生类定义自己的add运算符,我必须复制代码。如何更清楚地解决这个问题?有很多好的文档。更清楚地说,就像Oli说的,如果这样做会发生什么:定义一个Hex类,然后添加Bin加Hex?Number对这两个类都一无所知,所以您必须决定在派生类中执行什么操作:是否返回Bin?巫术?抛出错误?您仍然可以大量包装和使用实现,但最终需要派生类中的代码来解决此类问题。
Bin firstNum("101010111010");
Bin secondNum("1101011101");
Bin result = firstNum + secondNum;
class Base {
public:
Base operator+(const Base& addend) { return addOp(addend) ; }
private:
virtual Base addOp(const Base& addend) ;
} ;