继承自traits类
Inheriting from the traits class
在我自己的(比如说,conatiner)模板类中继承tracts类模板的缺点是什么?这是传统的、合法的吗?
只有traits可以继承其他traits(严格意义上是C++标准库所称的*_traits
),如果它们只在某些方面有所不同。但是,还有其他类似的类用于继承,从而简化了成员的定义。例如,在定义迭代器时,您可能会继承std::iterator
来定义适当的标记typedef。
通常,traits类只是一堆typedef。如果你想让它们全部在你的类中,你可以从它们继承。由于它们通常没有(非静态)成员,因此它们实际上是空类,因此从它们继承意味着应用空基类优化。那么缺点可能是什么:
- 继承通常意味着is-a关系。OO纯粹主义者可能会说,你不应该把它用于纯粹的技术目的。但在C++中,经常使用纯技术继承,所以我不会麻烦
- 如果您有多个基类,某些编译器将不再应用EBCO,因此您继承的trait基类对象将在类对象中占据一些空间,尽管它不包含任何数据
更多关于继承、EBCO等的材料:
- 赫伯·萨特论继承的使用和滥用
- Boost.Operators关于基类链接的文档
这在某种程度上取决于。我会区分OO概念继承的C++实现技术起源(这个词汇选择是个人的区别并不常见,但IMHO,重要的是区分设计概念和实现技术。)在这种情况下,我想说你不继承来自特征类,因为不存在isA关系。关于另一方面,虽然派生通常用于实现继承,这不是唯一可能的用途。非常完美从一个性状类派生的正常(例如,以最迭代器将从std::iterator
派生),只要它是请明确此派生不是用于实现的OO意义上的继承。特别是,你不想人们通过指向std::iterator
。
有人建议(赫伯·萨特)traits类具有受保护的析构函数,以防止任何风险删除。我不完全相信。traits类的语义通常不会任何人都会想到创建一个指向一个的指针。(上次是什么时候你在任何代码中看到std::iterator*
的时间?)(另一方面手,人们可能会问:为什么不呢?受保护的析构函数确实意味着特征类不是POD,但我想不出任何在合理的情况下,这很重要。)
无论如何,公开继承特性类以获得CCD_ 6的数目是标准的C++习惯用法。
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 继承自traits类