0

可能重复:
C++:隐藏规则背后的基本原理

假设我有一个代码:

class  A
{       
    public:
    void f(int s) {}
};



class B:public A
{      
    public:
    void f() {}
};

int main()
{      B ob;
   ob.f(4);
} 

然后在这种情况下,编译器会生成一个错误“没有匹配函数调用'B::f(int)'”但是类B已经继承了A作为公共所以B必须具有函数“void f(int s)”。不知道为什么编译器会在这里产生错误?

4

3 回答 3

5

那是因为B定义了一个不同的f,它隐藏f继承自A。如果您希望两者都可用(很可能),则必须使用 using-declarationB将其纳入范围:

class B : public A
{
  void f() {}
  using A::f;
};

此行为在 [class.member.loopkup] 中指定,尤其是第 4 段。

于 2012-11-29T07:55:23.397 回答
3

当您在 中声明时void f()B这会隐藏void f(int)继承自A。您可以使用以下命令将其重新纳入范围using

class B: public A
{      
public:
    void f() {}
    using A::f;
};
于 2012-11-29T07:55:47.563 回答
0

这称为隐藏 - 您可以查看C++ 常见问题解答条目。它描述了问题和解决方案。

于 2012-11-29T07:57:49.503 回答