继承traits类

时间:2013-02-05 08:29:57

标签: c++ templates traits

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

通常,traits类只是一堆typedef。如果您希望在课程中使用 all ,则可以继承它们。由于它们通常没有(非静态)成员,因此它们实际上是空类,因此从它们继承意味着应用空基类优化。那么缺点是什么:

  1. 继承通常意味着是-a 关系。 OO-Purists可能会说你不应该将它用于纯粹的技术支持。但是在C ++中经常使用纯技术继承,所以我不会打扰。
  2. 如果您有多个基类,则某些编译器将不再应用EBCO,因此您继承的特征基类对象将占用类对象中的一些空间,尽管它不包含任何数据。
  3. 关于继承,EBCO等的更多材料:

答案 2 :(得分:1)

取决于某种程度。我会区分OO概念 继承,以及C ++的C ++实现技术 推导。 (这种词汇的选择是个人的 不经常区分,但恕我直言,重要的是 区分设计概念和实施 技术。)在这种情况下,我会说你没有继承 来自特质类,因为没有isA关系。在 另一方面,虽然派生通常用于实现 继承,它不是唯一可能的用途。这很完美 正常来自特质类(例如,大多数情况下) 迭代器将从std::iterator派生,只要它是 清楚这个派生是用 来实现的 在OO意义上的继承。特别是,你不想要 人们通过指针操纵你的迭代器 std::iterator

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

任何方式,公开继承一个traits类来获取 一些typedef是标准的C ++习语。