【问题标题】:Calling the right overloaded parent method调用正确的重载父方法
【发布时间】:2013-07-12 08:27:40
【问题描述】:

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

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。 如果我将 value(Point &p) 重命名为 p_value(Point &p) 并改为调用该方法,这确实有效。我能以某种方式让重载的方法按预期工作吗?

【问题讨论】:

  • 查找“C++ 名称隐藏”。快捷方式:在QuadFunc 中写入using Func::value;
  • 已删除我的答案...你是对的,它不会有帮助

标签: c++ inheritance overloading


【解决方案1】:

QuadFunc 中的覆盖隐藏Func 中的重载函数。

您可以通过使用FuncQuadFunc 对象的引用(或指针)来绕过这种隐藏:

QuadFunc qf;
Func &func = qf;

Face f;
Point p;

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

更好的解决方案是将value 符号从Func 类“导入”到QuadFunc 类中。您可以使用 using 关键字来做到这一点:

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

    // ...
};

那么您不必使用参考解决方法。

【讨论】:

【解决方案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.;}
};

【讨论】:

  • 您为什么删除了@Joachim Pileborg 的答案已接受的答案?我很高兴获得声誉,但他的回答提供了更多信息,所以我认为您第一个接受的答案选择更好......
【解决方案3】:

如果你对编译器是显式的,那么虚函数会隐藏函数值(Point&),如下所示:

  func.Func::value(p);

确实有效!测试一下here

或者你可以添加

using Func::value;

按照另一个答案的建议进入 QuadFunc 声明。

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2021-07-12
    相关资源
    最近更新 更多