【问题标题】:Access Declaration of Base Class Overloaded Method基类重载方法的访问声明
【发布时间】:2011-06-04 04:18:33
【问题描述】:

鉴于我们在基类中重载了方法,以及作为私有/受保护继承的派生类。

  1. 我们能否只恢复重载方法的一个/几个原始访问级别?
  2. 在 GCC 4.4.0 上,我尝试将基本方法置于受保护的访问权限下,然后使用私有访问权限继承它。当我尝试将访问级别恢复为公共时,它可以工作!这是它假设的工作方式吗?还是编译器上的错误?据我了解,不应使用恢复访问级别来提升或降低成员的访问级别。

代码sn-p:

class base {
  public:
    void method() {}
    void method(int x) {}
  protected:
    void method2() {}
};

class derived : private base {
  public:
    base::method; // Here, i want to restore only the none parameterized method
    base::method2; // method2 is now public??
};

【问题讨论】:

  • BTW- 是像 base::method 这样的声明,完全等同于 using base::method?
  • @Kos,是的,但在 C++0x 中说 base::method; 不再有效。它已被 n3225 草案删除。

标签: c++ overloading


【解决方案1】:

通过using 声明更改继承函数的可访问性不能在给定的重载上选择性地完成,原因很简单,using 声明仅将 name 引入声明区域和根据定义,函数重载共享相同的名称。

我在这里看到的唯一选择是使用微不足道的转发功能:

class derived : private base
{
public:
    void method() { base::method(); }

    using base::method2; // method2 is now public
    // method(int) stays inaccessible
};

我不太确定我是否理解您的第二个问题,但可以:您可以通过 using 声明更改派生类中的基成员可访问性。

【讨论】:

  • 完美,谢谢..将此与第二个问题的@DeadMG答案结合起来,我们可以将问题标记为已解决..
【解决方案2】:

您本身并没有恢复访问权限。您设置访问权限。正如您在上面所做的那样,您可以显式设置任何方法的访问权限,包括之前声明为 private 的方法。

【讨论】:

    【解决方案3】:

    如果派生类需要,阻止受保护的方法公开是不可能的,因为您只需编写一个次要包装器就可以了。 private 是另一回事。

    【讨论】:

    • akh... 是的.. 有道理.. 谢谢.. 我正在阅读“C++ Complete References 4th Ed.”中的一章,其中有一段说明:“您可以使用访问声明来恢复公共和受保护成员的访问权限。但是,您不能使用访问声明来提高或降低成员的访问状态。例如,在基类中声明为私有的成员不能被派生类公开。 (如果 C++ 允许这种情况发生,它会破坏它的封装机制!)”.. 所以我认为他的意思是 public 和 protected 被认为是同一级别..
    猜你喜欢
    • 2012-12-12
    • 2011-07-01
    • 2018-04-23
    • 2018-05-17
    • 2021-11-16
    • 2018-07-22
    • 2020-10-22
    • 1970-01-01
    • 2017-10-30
    相关资源
    最近更新 更多