隐藏在派生类中的成员函数

Wac*_*cek 4 c++

请看下面的代码:

#include <iostream>
using namespace std;

class A {
  public:
    A() {};    
    virtual void foo(double d) { cout << d << endl; }
    virtual void foo(double d, int a) = 0;
  };

class B : public A {
  public: 
    B() {};
    virtual void foo(double d, int a) { cout << d << endl << a << endl; }  
  };

int main()
  {
  B b;
  b.foo(3.14);
  return 0;
  }
Run Code Online (Sandbox Code Playgroud)

编译器(试过g ++和visual c ++ 2008)说没有像B:foo(double)这样的函数.g ++的确切消息是:

main.cpp:21:错误:没有匹配函数来调用'B :: foo(double)'

它看起来像隐藏规则的效果,但在我看来这里不应该使用规则,因为我没有覆盖foo(double),并且两个foo方法都是在基类中定义的.

我知道我可以解决这个问题

using A::foo;
Run Code Online (Sandbox Code Playgroud)

派生类B中的声明

你能解释为什么代码不能编译以及C++的规则适用于何处?

sth*_*sth 6

隐藏规则不是关于覆盖,而是关于隐藏名称。如果派生类声明了一个成员函数,这会隐藏其他同名的基类成员函数。这也发生在你的情况。


GMa*_*ckG 5

命名阴影,而不是特定功能.一旦你foo进入B,所有基地foo(注意,名字!)都被遮蔽了.