在抽象基类中重载运算符的正确方法是什么?

Ano*_*ard 7 c++ polymorphism abstract-class operator-overloading

假设我有一个抽象基类,它只定义了一个可以在其上执行添加的容器:

class Base {
public:
    virtual ~Base() {}
    virtual Base operator+(const Base& rhs) =0;
};
Run Code Online (Sandbox Code Playgroud)

然后我想要Base的子类来提供实际的操作:

class Derived: public Base {
public:
    Base operator+(const Base& rhs) { // won't compile
        // actual implementation
    }
};
Run Code Online (Sandbox Code Playgroud)

这是我的问题:operator +()应该返回一个新的Base对象,但Base是抽象的,它不会编译.

我试图通过使用工厂返回对Base对象的引用来解决这个问题,但是在运算符的主体中我发现自己正在进行转换,因为加法仅对Derived对象有意义.

在任何情况下,感觉我咬自己的尾巴,有一个适当的解决方案吗?

更新:基于到目前为止的答案,似乎我使用了错误的模式.我想将接口与实现分开,因此库代码只需要知道接口和客户端代码提供的实现.我尝试通过将接口作为抽象基类提供,并将实现作为子类来实现.

更新2:我的问题实际上是2个问题,一个具体问题(关于在抽象类中重载运算符)和另一个关于我的意图(如何允许客户端自定义实现).前者已被回答:不要.对于后者,似乎我使用的接口类模式实际上是解决该问题的好方法(根据Griffiths和Radford),这只是我不应该混淆重载运算符.

CB *_*ley 8

最好的事情不是.

operator+返回一个值,根据定义,您不能返回抽象类型的值.仅为具体类型重载操作符,并避免从具体类型继承以防止"由重载操作符切片".

重载对称二元运算符,如operator+自由函数,您可以控制哪些类型的组合可以合理地组合,反过来防止组合对象没有意义的对象的组合.

如果您有一种通过两个基类引用执行"添加"并创建新对象的有效方法,则必须通过指针,引用或指针包装智能对象返回.因为你不能保留传统的语义,+我建议使用命名函数,例如,Add()而不是operator+使用"令人惊讶"的语法.