2013-07-12 49 views
2

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

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 ::值(点&)’不匹配函数”。就我而言,如果我打电话给 QuadFunc :: value(Point &),调用应该被重定向到父类Func。 如果将名称值(点& p)重命名为p_value(Point & p),然后调用该方法,那么这起作用。我能以某种方式让重载方法按照我的预期工作吗?

+3

查找“ C++名称隐藏“。快捷方式:在'QuadFunc'中写'使用Func :: value;'。 – Nbr44

+0

已删除我的答案......你是对的,它不会有帮助 – Jimbo

回答

5

你的重写在QuadFunc隐藏重载函数在Func

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

QuadFunc qf; 
Func &func = qf; 

Face f; 
Point p; 

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

更好的解决方案是“进口”的value符号到从QuadFuncFunc班。你这样做,与using关键字:

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

    // ... 
}; 

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

+1

你也可以在C++ 03中做到这一点。 – juanchopanza

+0

@juanchopanza哦,我不知道! –

+1

谢谢,我实际上发现了一篇关于名称隐藏的文章:http://www.programmerinterview.com/index.php/c-cplusplus/c-name-hiding/ – hfhc2

0

的虚函数隐藏函数值(点&),如果你是明确的编译器,如:

func.Func::value(p); 

它的工作!测试它here

在可替代的,你可以再补充

using Func::value; 

到QuadFunc申报,由另一个答案的建议。

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.;} 
}; 
+0

为什么你删除了接受的答案表单@Joachim Pileborg'答案是?我很高兴收到声望,但他的回答是提供更多信息,所以我认为你的第一个接受的答案选择更好...... – Zlatomir