C++ 重载函数隐藏在派生类中

C++ 重载函数隐藏在派生类中,c++,overloading,C++,Overloading,在派生类中,如果我从基类重新定义/重载函数名, 那么这些重载函数对于派生类是不可访问/可见的。 这是为什么 如果我们不重载派生类中基类的oveload函数 然后该函数的所有重载版本都可用于派生类 对象,这是为什么?? 这背后的原因是什么。如果您在编译器和链接器级别对此进行解释 那对我会更有帮助。不可能支持这种scinario吗 Edited For examble: class B { public: int f() {} int f(string s)

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

如果我们不重载派生类中基类的oveload函数 然后该函数的所有重载版本都可用于派生类
对象,这是为什么??
这背后的原因是什么。如果您在编译器和链接器级别对此进行解释
那对我会更有帮助。不可能支持这种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). 编辑 例如: B类 { 公众: int f(){} int f(字符串s){} }; D类:公共B类 { 公众: int f(int){} }; int main() { D; d、 f(1); //d、 f(字符串);//为d隐藏 }
现在对象“d”无法访问f()和f(字符串)。TTBOMK这没有真正的技术原因,只是Stroustrup在创建语言时认为这是更好的默认值。(在这种情况下,它类似于规则,即右值不会隐式绑定到非
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
};
或者通过显式调用:

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

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

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
}

您能否发布一些示例代码,您的描述一点也不清楚。可能重复@sbi我很抱歉发布一个重复的问题。事实上,我尝试了一段时间,如果有类似的问题,但我没有找到任何。我的搜索模式是错误的,那就是y没有找到存在的问题。没有问题。这就是“关闭副本”功能的目的。这是对另一个相关问题的回答,提供了理由——我很高兴成为这个小组的成员。这里的成员都很棒。我很高兴能在短时间内看到回复。@jon:事实上,这个问题是重复的。我投票决定删除这个。@jon。谢谢你的链接。事实上,这个问题已经得到了我想知道的全部细节。这里没有人回答我的“为什么”部分的问题!!!