重定义函数(虚拟)在多态中具有不同数量的参数

时间:2017-04-25 09:45:29

标签: c++ class inheritance

假设我有一类粒子:

class Particle {

public:
  virtual void SetLorenzVector( Vector3&, double M ); 

protected:
  LorenzVector P;
};

我还有一个衍生的光子类:

class Photons : public Particles {

public:
  virtual void SetLorentzVector ( Vector3&, /*double M = 0*/ );
};

Photons类中我想重新定义函数 SetLorentzVector,但我不想在那里执行第二个参数(因为它总是等于0)。 有C++风格的优雅方式吗?

默认参数有效吗?如果是这样,请注意,在基类中我希望SetLorentzVector只需要2个参数。

2 个答案:

答案 0 :(得分:0)

如果你真的想要覆盖该方法,它必须具有相同的签名,其中包括参数。这意味着,在这种情况下,将有2个参数。是的,默认参数是有效的,但是如果你有Particles *那就不会帮助你,就像@molbdnilo提到的那样。如果需要,可以在方法体中检查该参数值是否为0。 否则,您可以使用不同的签名创建一个新方法,即使用1个参数,但您只能使用Photons *。 无论如何,这取决于你将如何使用这些类。

答案 1 :(得分:0)

class Particle {

public:
  void SetLorenzVector( Vector3&, double M ); // should it really be virtual?
  virtual void SetLorenzVector( Vector3&) = 0;

protected:
  LorenzVector P;
};

class Photons : public Particles {

public:
  virtual void SetLorentzVector ( Vector3& v) {SetLorentzVector(v, 0.)};
};