调用正确的重载父方法

时间:2013-07-12 08:27:41

标签: c++ inheritance overloading

我有一个关于方法重载和继承的问题。一世 有以下计划:

class Face {};
class Point {};

typedef double Real;

class Func
{
private:
  const char *m_name, *m_desc;

public:
  Func(const char *name,
       const char *desc) : m_name(name), m_desc(desc) {}

  virtual Real value(Face &f) = 0;

  Real value(Point &p) {return 0.;}

  virtual ~Func() {}
};


class QuadFunc : public Func
{
public:
  QuadFunc() : Func("quad", "Quadratic") {}

  Real value(Face &f) override {return 0.;}
};

int main(int argc, char **argv)
{
  QuadFunc func;

  Face f;
  Point p;

  func.value(f);
  // why doesn't this work?
  func.value(p);

  return 0;
}

可悲的是,g ++告诉我“没有匹配函数来调用'QuadFunc :: value(Point&)'”。如果我打电话,我担心 应将QuadFunc :: value(Point&)调用重定向到父类Func。 如果我将值(Point& p)重命名为p_value(Point& p)并调用该方法,这确实有效。我可以以某种方式让重载方法按预期工作吗?

3 个答案:

答案 0 :(得分:5)

QuadFunc 中的覆盖隐藏 Func中的重载功能。

您可以使用Func QuadFunc对象的QuadFunc qf; Func &func = qf; Face f; Point p; func.value(f); func.value(p); // Works 引用(或指针)绕过此隐藏:

value

更好的解决方案是将QuadFunc符号“导入”Func类的using类。您可以使用class QuadFunc : public Func { public: using Func::value; // ... }; 关键字执行此操作:

{{1}}

然后您不必使用参考解决方法。

答案 1 :(得分:2)

如果要从基类重载成员函数(也可能需要已经提到的using),则需要使用virtual指令,因此代码将变为:

class QuadFunc : public Func
{
public:
  QuadFunc() : Func("quad", "Quadratic") {}

  using Func::value; //this is what you need
  Real value(Face &f) override {return 0.;}
};

答案 2 :(得分:0)

虚拟函数隐藏了函数值(Point&),如果您对编译器明确如下:

  func.Func::value(p);
它确实有效!测试here

另外,您可以添加

using Func::value;

进入QuadFunc声明,如另一个答案所示。