【问题标题】:How to expose hidden overloading from base class?如何从基类中暴露隐藏的重载?
【发布时间】:2011-08-10 13:27:49
【问题描述】:

鉴于此代码:

class base {
public:
  string foo() const; // Want this to be visible in 'derived' class.
}

class derived : public base {
public:
  virtual int foo(int) const; // Causes base class foo() to be hidden.
}

如何使 base::foo() 对派生可见,而不使用调用基类的虚拟方法重载来复制它? using 能做到吗,如果能,它去哪儿了,是这样的吗?

class derived : public base {
public:
  virtual int foo(int) const;
  using base::foo;
}

【问题讨论】:

    标签: c++ inheritance overloading hidden


    【解决方案1】:

    对不起,简短的回答,但是是的。就是这样,做你想做的事:

    class derived : public base {
    public:
      virtual int foo(int) const;
      using base::foo;
    };
    

    另外请注意,即使没有using,您也可以访问基地:

    derived x;
    string str = x.base::foo(); // works without using
    

    【讨论】:

    • 我认为这也适用于指针:x_ptr->base::foo(),对吧?
    • @William:是的。两者的区别在于using 将该名称的所有成员拉到一个范围内,因此它们都参与重载决议。
    【解决方案2】:

    using 指令将使从基类中选择的方法对派生的范围可见。但从设计的角度来看,这是不可取的,因为您在使用公共接口时将名称隐藏到派生的范围内。 (使用私有接口这样做更有意义)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-21
      • 2018-06-19
      • 1970-01-01
      • 2012-01-17
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多