重载函数隐藏在派生类中

esh*_*esh 15 c++ overloading

在派生类中如果我从Base类重新定义/重载函数名,
那么这些重载函数对派生类是不可访问/可见的.
为什么是这样??

如果我们不在派生类的基类中重载oveloaded函数,那么该函数的所有重载版本都可用于派生类
对象,为什么这个?
这背后的原因是什么?如果您在编译器和链接器级别解释这
将对我更有帮助.是不是可以支持这种scinario?

Edited  
For examble:

class B  
{  

  public: 
     int f() {}
     int f(string s) {}
};

class D : public B
{
   public:
    int f(int) {}
};

int main()
{
   D d;
   d.f(1);
   //d.f(string);  //hidden for D
} 

Now object 'd' can't access f() and f(string).

sbi*_*sbi 14

TTBOMK这没有真正的技术原因,只是Stroustrup在创建语言时认为这是更好的默认设置.(在此,它类似于rvalues不会隐式绑定到非const引用的规则.)

您可以轻松解决它将基类版本显式引入派生类的范围:

class base {
public:
  void f(int);
  void g(int);
};

class derived : public base {
public:
  using base::f;
  void f(float);
  void g(float); // hides base::g
};
Run Code Online (Sandbox Code Playgroud)

或通过明确调用:

derived d;
d.base::g(42); // explicitly call base class version
Run Code Online (Sandbox Code Playgroud)

  • 对另一个相关问题的回答提供了理由 - http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class-hide-other-overloads-of-the/1629074#1629074 (3认同)

小智 7

这些功能可用,您只需要明确调用它们:

struct A {
   void f(){}
};

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

int main() {
   B b;
   b.f();     // call derived function
   b.A::f();  // call base function
}
Run Code Online (Sandbox Code Playgroud)