C++ OO设计: Inheritance of template parameter

标签 c++ oop templates inheritance

我有一个以 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/

相关文章:

c++ - 字符串迭代器不在字符串末尾停止

具有多个初始化方法的 Python 子类?

c# - 在 C# 中通过 TCP 进行面向对象的通信

c++ - 模板类构造函数重载决议

C++ 抽象基模板类非 Void 方法

c++ - 为什么标准字符串函数比我的自定义字符串函数更快?

c++ - 使用 GLSL 的 OpenGL 3.3 中的纹理显示为黑色

c++ - hstrerror() 的替换函数

c# - 仿函数和 "generics"有什么区别

c++ - 使用可变参数模板的基于策略的设计