我有一个关于方法重载和继承的问题。一世 有以下计划:
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)并调用该方法,这确实有效。我可以以某种方式让重载方法按预期工作吗?
答案 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声明,如另一个答案所示。