2011-09-30 37 views
4

我有一个覆盖+运算符和一个子类'B'的类'A'。C++如何继承返回特定类型的运算符

我要继承“A的+操作而不是返回A型我想返回类型B.

我怎么能去这样做?我尝试从B调用父操作符并将结果投射到A对象,但它不会让我将父项投射给子女

我的+运算符能否以某种方式返回通用的'A'指针?

+0

你能提供+运营商的签名? –

+0

[C++:error C2440:''可能重复:无法从'A '转换为''B '](http://stackoverflow.com/questions/7614313/cerror-c2440- function-style-cast-can-convert-from-atype-to-bty) –

回答

2

它可能 - 没有技术原因它不能 - 它只是在使用操作符时违反了一些期望。因此,如果这是你自己的代码,去为它,但如果它要读取或由其他人使用,我会重新考虑的原因如下:

  1. 预期的行为是运营商如+=*=回报对修改该对象后被调用的对象的引用。像+*这样的运算符会返回一个新对象(它们非常必要,因为暗示它们被调用的对象没有更改)。他们不返回一个指针到一个新的对象,因为:
  2. 没有人期望他们,所以他们不会认为他们delete从运营商,这将导致内存泄漏回来的对象,并且:
  3. 你不能链接返回指针的操作符;像MyClass a = b + c + d;这样的表达式将不起作用,因为返回类型(MyClass*)与您需要传递给运算符的参数类型(可能为const MyClass&)不匹配。
  4. 将一个参考返回给一个新的对象可以让你在#3处工作,并且仍然支持多态,但是你仍然坚持#2,而且这是更糟糕的一对。这同样适用于重载操作符以获取指针或引用。

最终,只要做任何事情都可以让任何人使用代码变得简单 - 如果只是你,你可以做任何你想做的事情。只是要小心,如果它会落入别人的手中,因为他们作出假设。

希望这会有所帮助!

编辑:返回到一个新的对象的引用的一个例子:

A& A::operator + (const A& other) const 
{ 
    A* temp = new A(); // <- This is why it's a potential memory leak 
    /* Do some stuff */ 
    return *temp; 
} 

但是,有过一点时间思考这个问题,我会提出替代:定义=操作对于以A为参数的B来说。然后,你可以做这样的事情:

B b1; 
B b2; 
B b3 = b1 + b2; 

而且它不会有问题的是b1 + b2返回A,因为它是在=期间转换回A B。如果这适合你,我会推荐它高于任何其他方法,因为它可以让所有的操作员都预期行为。

+0

你可以给一些示例代码来说明如何返回泛型引用吗? – James

+0

@James - 为你提供一些示例代码。另一个建议,我会推荐我以前的任何想法。干杯! –

+0

另一种选择是返回隐藏指针类型成员变量中多态性的类型。这种类型然后多元化地起作用,但可以通过价值返回。 'auto_ptr' /'unique_ptr' /'scoped_ptr' /'shared_ptr'是接近的,但它们试图像指针一样行事。自定义智能指针可以像对象一样工作。 –

1

解决此问题的最简单方法是按照operator+=实施operator+。所以大致为:

A::operator+=(const A& right) { /* stuff */ } 
B::operator+=(const B& right) { static_cast<A&>(*this) += right; /* stuff */ } 
operator+(B left, const B& right) { return B += right; } 
+0

这很有趣,但是可以通过其他方式来完成吗?通过'+'来实现'+ ='。当前版本具有意想不到的属性,即“left + right”更改“left”值。如果不是那样的话,我会比我的建议更好... –

+0

@XavierHolt:'left'是一个副本。因此,调用者永远不会看到更改,这一点并不重要。 –

+0

@赞 - 啊哈!错过了。那么这很聪明。 –

2

我经常看到它在下列方式进行: