1

从我自己的(例如,conatiner)模板类中的特征类模板继承的缺点是什么?它是传统的,合法的吗?

4

3 回答 3

4

只有特征可以继承其他特征(严格意义上的 C++ 标准库调用*_traits),如果它们应该只在某些方面有所不同。但是还有其他类似的用于继承简化定义成员的类。例如,在定义迭代器时,您可能会继承std::iterator以定义适当的标记 typedef。

于 2013-02-05T08:52:15.803 回答
3

通常,特征类只是一堆类型定义。如果你想让它们在你的类中,你可以从它们继承。由于它们通常没有(非静态)成员,它们实际上是空类,因此从它们继承意味着适用空基类优化。那么缺点可能是:

  1. 继承通常意味着一种is-a关系。因此,OO 纯粹主义者可能会说您不应该将它用于纯粹的技术原因。但是在 C++ 中,经常使用纯技术继承,所以我不会打扰。
  2. 如果您有多个基类,一些编译器将不再应用 EBCO,因此您继承的 trait 基类对象将占用您的类对象中的一些空间,尽管它不包含数据。

更多关于继承、EBCO 等的材料:

于 2013-02-05T08:54:38.777 回答
1

这取决于,有点。我会区分继承的 OO 概念和派生的 C++ 实现技术。(这个词汇的选择是个人的。区分并不经常,但恕我直言,区分设计概念和实现技术很重要。)在这种情况下,我会说你不继承 自一个特征类,因为没有 isA 关系。另一方面,虽然派生通常用于实现继承,但它并不是唯一可能的用途。从特征类派生是完全正常的(例如,以大多数迭代器从 派生的方式std::iterator),只要很明显这种派生不是用于实现OO意义上的继承。特别是,您不希望人们通过指向 std::iterator.

已经建议(不亚于 Herb Sutter 提出)特征类具有保护析构函数,以防止通过它们删除任何风险。我并不完全相信。特征类的非常语义使得任何人通常都不会创建指向它的指针。(您最后一次std::iterator*在任何代码中看到 an 是什么时候?)(另一方面,有人可能会问:为什么不呢?受保护的析构函数确实意味着特征类不是 POD,但我想不出任何合理的这很重要的情况。)

无论如何,从一个traits 类中公开继承来获得一个数量typedef是一个标准的C++ 习惯用法。

于 2013-02-05T10:12:43.737 回答