假设我有一个抽象基类,它只定义了一个容器,可以在其上执行加法操作:
这是我的问题:operator+() 应该返回一个新的 Base 对象,但是 Base 是抽象的,所以无法编译。
我尝试通过使用工厂来返回一个指向 Base 对象的引用来解决这个问题,但在运算符的主体中,我发现自己正在执行转换,因为加法只对 Derived 对象有意义。
无论如何,感觉就像是咬自己的尾巴,有没有正确的解决方案?
更新:根据迄今为止的答案,似乎我使用了错误的模式。我想将接口与实现分离,以便库代码只需要知道接口,而客户端代码提供实现。我试图通过提供抽象基类作为接口,以及子类作为实现来实现这一点。
class Base {
public:
virtual ~Base() {}
virtual Base operator+(const Base& rhs) =0;
};
我希望 Base 的子类提供实际操作:
class Derived: public Base {
public:
Base operator+(const Base& rhs) { // won't compile
// actual implementation
}
};
这是我的问题:operator+() 应该返回一个新的 Base 对象,但是 Base 是抽象的,所以无法编译。
我尝试通过使用工厂来返回一个指向 Base 对象的引用来解决这个问题,但在运算符的主体中,我发现自己正在执行转换,因为加法只对 Derived 对象有意义。
无论如何,感觉就像是咬自己的尾巴,有没有正确的解决方案?
更新:根据迄今为止的答案,似乎我使用了错误的模式。我想将接口与实现分离,以便库代码只需要知道接口,而客户端代码提供实现。我试图通过提供抽象基类作为接口,以及子类作为实现来实现这一点。
更新2:我的问题实际上包含两个问题,一个具体的问题(有关在抽象类中重载运算符),以及另一个有关我的意图的问题(如何允许客户端自定义实现)。前者已得到答复:不要这样做。对于后者,似乎我使用的接口类模式是解决该问题的好方法(根据Griffiths and Radford),只是不应该涉及重载运算符。
std :: auto_ptr <Base> Base :: Add(const Base&base)const;
。需要做一些工作才能使所有情况下的a.Add(b)
等同于b.Add(a)
,但这肯定是一个方法。 - CB Bailey