Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 继承运算符+;()_C++_Class_Operator Overloading - Fatal编程技术网

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