1. public继承体现is-a关系,要求接口的完全继承,而复合体现has-a或"根据某物实现出"的关系.
当复合发生在应用域(世界中的某些事物,如人,汽车,一张剪辑视频画面等)内的对象之间,表现出has-a关系,当发生在实现域(细节上的人工制品,如缓冲区,互斥器,查找树等)内,表现出is-implementation-in-terms-of(根据某物实现出)的关系.
2. 对于is-implementation-in-terms-of,例如基于list实现set(当空间比时间更重要的时候可能这样做),那么使用public继承显然是不合适的,因为list可以进行的操作set未必允许(例如拥有两个相同元素),因此可以使用复合,:
template<Set> class Set{ public: bool member(const T& item) const; void insert(const T& item); void remove(const T& item); std::size_t size() const; ... private: std::list<T> rep; } //具体实现略
以上例子中set对象就是"根据list实现出来"的.
时间: 2024-10-11 23:21:12