用继承的类覆盖相同的函数

时间:2015-02-20 10:10:45

标签: c++ override overloading

我有这个简单的代码:

#include <iostream>
using namespace std;

class GenericMove {};

class SwapMove: public GenericMove {};

class SoftConstraint {
  public:
    virtual int evaluate(GenericMove& gm) = 0;
};

class M1: public SoftConstraint {
  public:
    int evaluate(GenericMove& gm){ return 1; }
    int evaluate(SwapMove& gm){ return 2; }
};

int main () {
  M1 m1;
  GenericMove* swapmove = new SwapMove();
  cout << "Hello " << m1.evaluate(*swapmove) << endl;
  return 0;
}

我想在M1的evaluate函数中辨别GenericMove和SwapMove,所以我希望主打印“Hello 2”。

有没有办法区分swapmove不仅是一个简单的GenericMove,而且它也是M1内的SwapMove?

这在C ++中可行吗? 提前谢谢!

1 个答案:

答案 0 :(得分:1)

不,这在C ++ AFAIK中无法直接实现,但您可以使用double dispatch来获得所需的结果。

class GenericMove;
class SwapMove;

class SoftConstraint {
public:
    virtual int evaluate(GenericMove& move) = 0;
    virtual int evaluate(SwapMove& move) = 0;
};

class M1 : public SoftConstraint {
public:
    int evaluate(GenericMove& move) { return 1; }
    int evaluate(SwapMove& move) { return 2; }
};

class GenericMove {
public:
    virtual int evaluate(SoftConstraint& constraint) {
        return constraint.evaluate(*this);
    }
};

class SwapMove : public GenericMove {
public:
    int evaluate(SoftConstraint& constraint) {
        return constraint.evaluate(*this);
    }   
};

int main () {
  M1 m1;
  GenericMove* swapmove = new SwapMove();
  std::cout << "Hello " << swapmove->evaluate(m1) << std::endl;
  return 0;
}

请注意,在我的提案中,您必须调用move实例的evaluate方法,而不是调用约束的evaluate方法。但这很容易改变。

Double dispatch利用了this指针的静态类型始终是使用this指针的函数所属的类型这一事实。在我们的示例中,thisGenericMove::evaluate的静态类型为GenericMove* ,因此对SoftConstraint::evaluate的调用选择引用GenericMove实例作为其参数的函数。另一方面,thisSwapMove::evaluate的静态类型为SwapMove* ,因此对SoftConstraint::evaluate的调用选择了对SwapMove实例的引用作为其参数的函数。

Double dispatch允许您使用调用接收器的类型和一个参数的类型选择方法。