调用正确的重载父方法

hfh*_*hc2 2 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;
}
Run Code Online (Sandbox Code Playgroud)

可悲的是,g ++告诉我"没有匹配函数来调用'QuadFunc :: value(Point&)'".就我而言,如果我调用QuadFunc :: value(Point&),则应将调用重定向到父类Func.如果我将值(Point&p)重命名为p_value(Point&p)并调用该方法,则此方法有效.我可以以某种方式让重载方法像我期望的那样工作吗?

Som*_*ude 5

你的覆盖QuadFunc 隐藏了重载函数Func.

您可以通过使用对象的Func引用(或指针)来绕过此隐藏QuadFunc:

QuadFunc qf;
Func &func = qf;

Face f;
Point p;

func.value(f);
func.value(p);  // Works
Run Code Online (Sandbox Code Playgroud)

更好的解决方案是将value符号"导入" 到QuadFunc类中的Func类中.您可以使用using关键字执行此操作:

class QuadFunc : public Func
{
public:
    using Func::value;

    // ...
};
Run Code Online (Sandbox Code Playgroud)

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