我有一个以 Base 为基类的继承链。我希望能够编写一个继承 Base 和可能的另一个 Base 派生类的类模板。我可以使用虚拟继承,但我找到了另一种解决方案。我想知道它是否是常见的/可观的/合法的类设计:
编写一个类模板,其中模板参数是它派生的类,即它必须是 Base 或 Base 派生类。在构造函数中,我可以使用静态断言来真正确保用户没有使用任何非法类作为模板参数。
如果它有效,我将永远不会有虚拟继承问题......问题是,这样做是可以的。我在其他项目中从未见过它,所以我想在使用它之前先确定一下。
编辑:为了确保我不会混淆你,这里有一些代码:
class Base
{
};
class Derived : public Base
{
};
template <Class TheBase>
class MyDerived : public TheBase
{
};
现在我可以使用 Base
或任何 Base
派生类,例如Derived
,作为 TheBase
参数。
最佳答案
这是一个有效的设计模式。它是 mixin 继承,而不是 CRTP。 Mixin 继承提供了一种通过程序员手动线性化继承层次结构来安全地模拟多重继承的方法。模板化的类是 mixins。如果你想用多个 mixin 扩展一个类,你必须决定组合的顺序,比如 Big<Friendly<Dog> >
.
Dr Dobb's article 中描述了 C++ 中的 Mixin 编程。 .
Mixins 可用于实现 GoF 装饰器模式的静态版本,如 here 所述.
Mixin 在 C++ 中扮演的角色与 Scala 和 SmallTalk 中的特征(不是 C++ 特征)类似。
在 CRTP它是模板的基类:
template <class Param>
class Base { ... };
class Derived : public Base<Derived> { ... };
关于C++ OO设计: Inheritance of template parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530839/