在我自己的(例如,conatiner)模板类中继承 traits 类模板的缺点是什么?它是传统的,合法的吗?
答案 0 :(得分:4)
只有traits可以继承其他特性(严格意义上是C ++标准库调用*_traits
),如果它们只应在某些方面有所不同。但是还有其他类似的类用于继承,这简化了对成员的定义。例如。在定义迭代器时,您可能会继承std::iterator
来定义适当的标记typedef。
答案 1 :(得分:3)
通常,traits类只是一堆typedef。如果您希望在课程中使用 all ,则可以继承它们。由于它们通常没有(非静态)成员,因此它们实际上是空类,因此从它们继承意味着应用空基类优化。那么缺点是什么:
关于继承,EBCO等的更多材料:
答案 2 :(得分:1)
取决于某种程度。我会区分OO概念
继承,以及C ++的C ++实现技术
推导。 (这种词汇的选择是个人的
不经常区分,但恕我直言,重要的是
区分设计概念和实施
技术。)在这种情况下,我会说你没有继承
来自特质类,因为没有isA关系。在
另一方面,虽然派生通常用于实现
继承,它不是唯一可能的用途。这很完美
正常来自特质类(例如,大多数情况下)
迭代器将从std::iterator
派生,只要它是
清楚这个派生是用 来实现的
在OO意义上的继承。特别是,你不想要
人们通过指针操纵你的迭代器
std::iterator
。
有人建议(由Herb Sutter提供)
特征类具有保护析构函数,以防止任何风险
通过他们删除。我并不完全相信。很
特征类的语义是这样的,它通常不会均匀
任何人都可以创建一个指针。 (最后一次是什么时候
你在任何代码中看到std::iterator*
的时间吗?)(另一方面
有人可能会问:为什么不呢?受保护的析构函数确实意味着
特质类不是POD,但我想不出任何
合理的情况,这是重要的。)
任何方式,公开继承一个traits类来获取
一些typedef
是标准的C ++习语。