【问题标题】:overloaded functions are hidden in derived class重载函数隐藏在派生类中
【发布时间】:2011-03-13 05:56:41
【问题描述】:

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

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

已编辑
例如:

B类
{

  民众:
     整数 f() {}
     int f(string s) {}
};

D类:公共B
{
   民众:
    整数 f(int) {}
};

主函数()
{
   d;
   d.f(1);
   //d.f(字符串); //隐藏为 D
}

现在对象 'd' 不能访问 f() 和 f(string)。

【问题讨论】:

标签: c++ overloading


【解决方案1】:

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

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
}

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • 这个对另一个相关问题的回答提供了基本原理 - stackoverflow.com/questions/1628768/…
    • 我很高兴成为这个小组的成员。这里的成员很棒。我很高兴很快就看到了回复。
    • @jon:实际上,这使得这个问题重复了。我投票删除了这个。
    • @jon。谢谢你的链接。实际上,这个问题已经得到了我想知道的全部细节。这里没有人回答我的“为什么”部分问题!!!
    猜你喜欢
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多