21 December 2022

C++ 核心指南目录

C.136: Use multiple inheritance to represent the union of implementation attributes

理由

某些形式的混合类有状态,并且基于这些状态操作运行。如果这些操作是虚的,则需要使用继承。如果不是虚的,则使用继承能够避免样板代码和转发。

例子

class iostream : public istream, public ostream {   // very simplified
    // ...
};

istream 提供输入操作接口(以及一些数据), ostream 提供输出操作接口(以及一些数据)。 iostream 提供 istreamostream 接口的集合以及输入输出之间的同步。

注意

这是很少使用的方法,因为基于单根节点的继承层级也能实现一样的效果。

例子

有时候,一个“属性的实现”更像一个混合类( mixin ),通过注入成员来确定实现的某些行为,来确定需要实现的某些策略。比如 std::enable_shared_from_this 或基于boost.intrusivelist_base_hook 以及intrusive_ref_counter