复合关系
当某种类型的对象内含其他种类型的对象时,它们之间便是这种复合关系。比如:
class Address {
//... };
class PhoneNumber {
//... };
class Person
{
public:
//...
private:
std::string name;
Address address;
PhoneNumber voiceNumber;
PhoneNumber faxNumber;
};
在这里例子中,Person
对象就由 std::string
, Address
, PhoneNumber
复合而成。
has-a 以及 is-implemented-in-tems-of
之前说过,public 继承就意味着 is-a 的关系。对于复合,它也有它对应的含义,它有两个意义。复合意味着 has-a 或者 is-implemented-in-terms-of。
上面的 Person class 就是 has-a 的关系。比较麻烦的是区分 is-a 和 is-implemented-in-terms-of 的关系。
比如说,你需要写出一个模板类,来实现由不重复对象组成的容器。你的第一反应,当时是直接使用 stl 中提供的 std::set 容器。但是这个容器背后是由红黑树实现的,虽然查找、插入、删除的速度都在对数级,但是每个元素都有三个指针的额外开销。你不希望用空间换时间,所以想自己另外实现一个模板类。
经过考虑之后,你决定顶层用 stl 中的 std::list 去实现 std::set 的功能。要想调用 std::list 。当然有两种实现形式:第一是继承它,这样就可以获得它的成员;或者是内含它的对象或指针,通过这个对象或指针去调用它的成员。如果你打算采用第一种方式:
tem