复合(Composition)
下图中,类 queue
(队列)包含一个类 deque
(双端队列),并借用 deque
已经实现的一些功能来实现 queue
所需要的东西。简而言之,类 queue
中包含一个 deque
。
template <class T, class Sequence = deque<T>>
class queue
{
...
protected:
Sequecte c; //底层容器
public:
//以下完全利用 c 的操作函数完成
bool empty() const { return c.empty(); }
void push(const value_type& x) { c.push_back(x); }
void pop() { c.pop_front(); }
...
}
复合关系下的构造与析构
构造由内而外:
Container 的构造函数首先调用 Component 的默认构造函数然后才执行自己的。
析构由外而内:
Container 的析构函数首先执行自己的,然后再调用 Component 的析构函数。
委托(Delegation)(Composition by reference)
下图中,String
是对外暴露的接口,具体实现是在指针指向的 StringRep
中实现的。因此如果某一天 String
的具体实现需要改变,可通过修改 String
中指向具体实现的那个指针的指向即可完成修改,使用 String
的用户无需关心其内部是如何修改的。
//file String.hpp
class StringRep;
class String
{
public:
String();
...
~String();
private:
//point to implement
//指向为我实现所有功能的那个类
StringRep* rep; //通过指针的方式可调用StringRep的函数
}
//file String cpp
#include "String.hpp"
namespace{
class StringRep
{
friend class String;
StringRep(const char* s);
~StringRep();
int count;
char* rep;
}
}
Strng::String(){...}
继承(Inheritance)
子类的对象包含父类的成分。 Base 的构造必须是 virtual
,否则会出现 undefined behavior
。
class Base
{}
class Derived: public Base //还有private protected方式
{}
构造由内而外
Derived 的构造函数首先调用 Base 的默认构造函数,然后才执行自己的。
析构由外而内
Derived 的析构函数先执行自己的,然后才调用 Base 的析构函数。