继承自traits类

Inheriting from the traits class

本文关键字:traits 继承      更新时间:2023-10-16

在我自己的(比如说,conatiner)模板类中继承tracts类模板的缺点是什么?这是传统的、合法的吗?

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

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

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

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

  • 赫伯·萨特论继承的使用和滥用
  • Boost.Operators关于基类链接的文档

这在某种程度上取决于。我会区分OO概念继承的C++实现技术起源(这个词汇选择是个人的区别并不常见,但IMHO,重要的是区分设计概念和实现技术。)在这种情况下,我想说你不继承来自特征类,因为不存在isA关系。关于另一方面,虽然派生通常用于实现继承,这不是唯一可能的用途。非常完美从一个性状类派生的正常(例如,以最迭代器将从std::iterator派生),只要它是请明确此派生不是用于实现的OO意义上的继承。特别是,你不想人们通过指向std::iterator

有人建议(赫伯·萨特)traits类具有受保护的析构函数,以防止任何风险删除。我不完全相信。traits类的语义通常不会任何人都会想到创建一个指向一个的指针。(上次是什么时候你在任何代码中看到std::iterator*的时间?)(另一方面手,人们可能会问:为什么不呢?受保护的析构函数确实意味着特征类不是POD,但我想不出任何在合理的情况下,这很重要。)

无论如何,公开继承特性类以获得CCD_ 6的数目是标准的C++习惯用法。