【问题标题】:Selective inheritance C++选择性继承 C++
【发布时间】:2012-12-18 13:19:44
【问题描述】:

您能否解释一下为什么以下代码可以编译并且工作正常(在 gcc-4.3.4 上检查)。我认为选择性继承不能削弱甚至加强对成员/方法的访问。不破坏封装规则吗?

#include <iostream>

class A {
protected:
    void foo() { std::cout << "foo" << std::endl;  }
};

class B : private A {
public:
    using A::foo;   //foo() becomes public?!
};

int main() {
    B b;
    b.foo();
    return 0;
}

【问题讨论】:

  • +1 教我一些东西。
  • 您在从标准容器私有继承时执行此操作。基本上,您禁止向上转换(这意味着您不需要虚拟析构函数),但是您允许重新实现/转发一些乏味的操作。

标签: c++ inheritance


【解决方案1】:

从语言的角度来看,这并没有什么问题(设计好不好是另外一回事)。

任何班级都可以选择向更广泛的受众公开它可以访问的内容。

原则上,您的示例与以下内容没有什么不同:

class B : private A {
public:
    void bar() { foo(); }
};

除了这里foo() 是通过代理暴露的。

你不能做的恰恰相反:公共派生类不能限制对可通过基类访问的东西的访问。

【讨论】:

  • 当然可以;在struct A { int i; }; struct B: A { private: using A::i; }; 名称B::i 别名和影子A::i 具有私人访问权限。当然,这不会阻止你写b.A::i,这也许就是你的意思。
  • @ecatmur: B 可以混淆事物,但不能限制访问。我总是可以向上转换对A&amp; 的引用并使用A 的API:A&amp; a = b; a.i = 42;
  • @ecatmur:我对hide这个词的选择有点不幸。我改进了措辞。
  • @NPE:访问是静态检查的,就像在 ecatmur 的示例中您可以向上转换以获得访问权限一样,您可以向上转换以释放访问权限。这与混淆无关,而是与构建语言的基本原则有关。
  • 设计是否好是另一回事 => 例如,添加一个方法到std::vector 会很有用,而我通常建议为此使用免费函数有些人不情愿(生活和死亡的对象......),在这种情况下private继承+方法转发允许模拟mixins。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多