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),这只是我不应该混淆重载运算符.
最好的事情不是.
operator+返回一个值,根据定义,您不能返回抽象类型的值.仅为具体类型重载操作符,并避免从具体类型继承以防止"由重载操作符切片".
重载对称二元运算符,如operator+自由函数,您可以控制哪些类型的组合可以合理地组合,反过来防止组合对象没有意义的对象的组合.
如果您有一种通过两个基类引用执行"添加"并创建新对象的有效方法,则必须通过指针,引用或指针包装智能对象返回.因为你不能保留传统的语义,+我建议使用命名函数,例如,Add()而不是operator+使用"令人惊讶"的语法.