C++ 调用正确的重载父方法

C++ 调用正确的重载父方法,c++,inheritance,overloading,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

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

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(点&)调用应重定向到父类Func。
如果我将value(Point&p)重命名为p_value(Point&p)并调用该方法,那么这是可行的。我能以某种方式使重载方法按预期工作吗?

您在
QuadFunc
中的重写隐藏了
Func
中的重载函数

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

QuadFunc qf;
Func &func = qf;

Face f;
Point p;

func.value(f);
func.value(p);  // Works

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

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

    // ...
};

那么您就不必使用引用解决方法。

如果您对编译器是显式的,那么虚拟函数将隐藏函数值(点&),如下所示:

  func.Func::value(p);
它确实有用!测试一下

在另一种情况下,您只需添加

using Func::value;

如另一个答案所建议的那样,您需要使用
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.;}
};

查找“C++名称隐藏”。快捷方式:使用Func::value编写
QuadFunc
中的code>已删除我的答案。。。你是对的,它不会有帮助的。你也可以在C++03中这样做。@juanchopanza哦,我不知道!谢谢你,我发现了一篇关于姓名隐藏的文章:你为什么删除了接受的答案表@Joachim Pileborg的答案?我很高兴获得声誉,但他的回答提供了更多的信息,所以我认为你的第一个被接受的答案选择更好。。。