【问题标题】:C++ Prevent multiple inheritance of two classes by the derived classes of a certain classC++防止某个类的派生类对两个类进行多重继承
【发布时间】:2013-06-14 23:21:47
【问题描述】:

有点冗长的标题,但这里是:

我有一种情况,我想防止两个类被同一个类或一个家族的任何类派生。在代码中:

    class A;
    class B;

    class C: public A; //Yes.
    class D: public B; //Yes.

    class E: public A, public B; //Yes.
    class F: public C, public B; //Yes.

    class G: public A /*Disallow inheritance of B at this point somehow*/;
    class H: public G, public B; //Error at this point...

    class I;
    class J: public G, public I; //...but not at this point.

在这种情况下,A 和 B 的私有成员对任何派生类都保持私有,而友谊会破坏这种设计。我怎么能做到这一点?

【问题讨论】:

  • 你在解决什么问题?这个设计是解决方案?
  • 您应该考虑模板化接口、类型特征和概念检查来解决此类问题。接口实现可能会作为模棱两可的错误消息发生冲突。
  • @GManNickG 我正在制作一个模拟 DAW 中使用的概念的实时音频库 - 我有两个抽象类 Input 和 Output,然后我有另一个抽象类 AudioSource,它是类的模板生成音频输出但不接受输入(如正弦波发生器或音频文件)。如果我偶然(或其他人)同时派生了 AudioSource 和 Input,那将违反类的定义(并且可能会在未来产生一些不良影响)。我可以把它记录下来,但如果我能强行阻止它发生就更好了。
  • @g-makulik 我认为模板可能会解决这个问题,但结果会有点令人困惑,除非我能以某种方式将它隐藏在 cpp 中。 boost 是否已经制作了类似的东西?
  • @user2228070:我明白了。也许一个类可以同时是InputOutput 提供者?对这样的事情进行建模可能没有意义,但我认为想要禁止它可能不是一个基本问题。

标签: c++ inheritance private multiple-inheritance


【解决方案1】:

如果不深入研究,它看起来像是一个典型的问题,过去使用静态(编译时解决)多态性来解决。 此类框架的基本方法是 CRTP 元编程模式(仅仅是因为您为继承类引入了一个强有力的策略,即如何使用或组合父类/基类)。

看看如何提供

  • type traits(在符合 C++11 标准之前,有一些库可以支持此功能)
  • 概念检查(几个库支持这一点,例如boost::concept_check
  • SFINAE 和/或显式(编译时)错误条件

您可能会考虑使用各种离散的客户端助手 (API) 类来聚合最终类的接口实现;这指的是隐藏编译单元中的某些实现以及最终创建具体实例所必需的工厂。

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2015-07-13
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多