21 December 2022

C++ 核心指南目录

“Use multiple inheritance to represent the union of implementation attributes”

理由

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

例子

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