关于c ++:重载函数隐藏在派生类中

overloaded functions are hidden in derived class

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

如果我们不从派生类中的基类重载oveLoaded函数然后,该函数的所有重载版本都可用于派生类对象,这是为什么??这背后的原因是什么?如果您在编译器和链接器级别解释这个问题那对我更有帮助。不可能支持这种闪烁吗??

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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).


ttbomk这没有真正的技术原因,只是stroustrup在创建语言时认为这是更好的默认值。(在这个规则中,它类似于rvalues不隐式绑定到非const引用。)

您可以很容易地解决这个问题,即显式地将基类版本引入派生类的范围:

1
2
3
4
5
6
7
8
9
10
11
12
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
};

或者通过明确地调用:

1
2
derived d;
d.base::g(42); // explicitly call base class version


函数是可用的,您只需显式调用它们:

1
2
3
4
5
6
7
8
9
10
11
12
13
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
}