【问题标题】:Can one hide parts of the inheritance hierarchy in C++?可以在 C++ 中隐藏部分继承层次结构吗?
【发布时间】:2017-04-13 04:08:12
【问题描述】:

考虑以下几点:

B 公开继承自类 A。两者都在库中提供,我无法修改它们。

我想实现一个派生自B 的类Foo,但我想允许Foo 的用户仅使用AFoo 的公共函数(而不是来自B)。对他们来说,Foo 继承自 B 是无关紧要的,原则上这是我无法避免的实现细节。

所以,原则上我希望 Foo 公开继承自 A,但私下继承自 B

C++ 中是否有一些结构可以让我这样做?

我必须补充一点,虚拟继承不是一个选项,因为在我的例子中,A 派生自 QObject(请参阅Is it safe to use *virtual* multiple inheritance if QObject is being derived from DIRECTLY?)。

(注意:对于感兴趣的人:在我的情况下,AQWindowBQt3DExtras::Qt3DWindow

【问题讨论】:

  • struct foo : A { B b; } 工作吗?
  • 只是不要记录你的类是从 B 派生的。说它是从 A 派生的。这不是阻止确定的用户想要访问 B 的方法,但没有其他方法。跨度>

标签: c++ qt oop inheritance


【解决方案1】:

你可以在 c++ 中做的最接近的是:

class Foo : private B {
  public:
    using A::foo; // Expose function foo in Foo's API.
    using A::bar;
    operator A&() { return *this; } // Implicit conversion to `A` when needed.
    operator A const&() const { return *this; }
};

【讨论】:

  • A * a = pointer_to_foo,这是Qt的重要部分,不起作用
  • @Danh,另一个喜欢参考的原因。您不能添加指针强制,因为它们是内置类型。 OP 必须显式转换。
  • 是的,我也更喜欢使用引用,但据我所知,Qt 通常是这样工作的
  • @StoryTeller 考虑提供到const A & 的转换。
  • @RalphTandetzky,是的,这是个好主意。我对 C++ 的不满是,没有办法一次性提供两者
【解决方案2】:

因为这是 Qt,我认为这是你能做的最接近的:

struct Foo : A {
    // override all function of A, forward its to B
private:
    B b; // or pointer to B, it's depend on your design
};

【讨论】:

  • 这会在Foo 中为您提供两个A,一个是继承的一个,另一个是b 的一部分。 (具体来说,有两个QWindows,这听起来不对——这只是一个窗口,不是吗?)这可能不是我们想要的。我还假设Foo 必须 B,例如因为指向它的指针存储为指向B 的指针。
  • @PeterA.Schneider OP 说 对于他们来说,Foo 继承自 B 是无关紧要的
  • 不适合用户,但必须在某个地方提出要求——毕竟这是无法避免的。
  • @PeterA.Schneider 我认为 OP 考虑到了这一点_一个我无法避免的实现细节_让他稍微澄清一下这个要求
  • 理想的情况是拥有一个普通的QWindow,其中包含一个用于 3D 表示的小部件,这将对应于这个答案。但是,目前在 Qt3D 中,必须为其创建一个窗口。原则上可以使用QWidget::createWindowContainer() 嵌入窗口,但我认为这个问题本身很有趣,可能会在另一种情况下出现,这就是我问它的原因。
猜你喜欢
  • 2011-08-10
  • 2014-12-22
  • 2023-03-28
  • 2011-06-16
  • 2014-10-06
  • 2016-08-27
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多