下图中,类 queue (队列)包含一个类 deque (双端队列),并借用 deque 已经实现的一些功能来实现 queue 所需要的东西。简而言之,类 queue 中包含一个 deque。
template复合关系下的构造与析构> 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 的析构函数。



