c++ - 元类会取代继承吗?

标签 c++ inheritance template-meta-programming metaclass

我看过一些关于元类的视频和文章,在我看来,它们有可能取代继承并提供一种执行某种编译时继承的方法。

使用元类,我可以在编译期间提供接口(interface)、默认函数实现,甚至类的实现(当然不是函数体)的正确性。那么有一些元类中不能做的事情可以用继承、多态和 OO 的东西来完成吗?

最佳答案

作为一般性评论,我作为 Python 元类的“常客”作者写道: 元类不是意味着“日常”使用,但是 C++ 元类可能与它们在 Python 中的不同,我几乎看不到这样的概念被用来取代像继承这样常见的东西.

继承有其作用。如果您需要为整个类层次结构制定特殊规则,那么使用元类来指定这些规则可能会很有用。 (C++ 提案和我浏览过的大多数解释性 Material 中的第一个示例是“接口(interface)”——它要求所有方法都是虚拟的)。因此,假设您在系统的一整套类中找到了您想要的特殊规则,并且可以使用元类来表达它,这并不妨碍您从该元类创建单个基类,并创建所有其他类“正常”继承,如果从一个这样的类到另一个类的改变只是通常的方法重写和特化:继承仍然会更简单,无论是代码,无论谁阅读你的代码,以及围绕周围发展的工具链回声系统C++ 在几十年的语言存在中。

所以,是的,元类继承可以允许您在元类中编码您的类的所有通用功能,并且它们只是使用这个元类创建新类,而不是继承.但地球上没有这样做的动机。

只是为了回到 Python,在那里我很熟悉这个概念:最近的语言 took one step in the opposite direction - 通过在 3.6 版的正常继承中启用两种机制,这两种机制以前只能通过元类实现,并且在这样做的过程中,进一步减少了仅由于元类必然要求的额外复杂性而需要元类的用例。

关于c++ - 元类会取代继承吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45755210/

相关文章:

c++ - 获取类型列表中类型的索引

c++ - 如果字符串表示负数,则使用错误处理将字符串解析为无符号整数

c++ - OpenGL 渲染大量动态二维圆

c++ - 具有不同模板参数的继承

c# - 正确覆盖 [NotNull] 属性

android - 继承和泛型 java android

c++ - SDL 绘图程序卡住

c++ - 使用 size_t 差异复制字符串的一部分

swift - Swift 中的元编程

c++ - C++ 模板的声明和定义分离