Composition(复合),表示has-a(可以理解为外驻) Adapter(容器适配器)
template <class T> class queue { //先进先出的队列 ... protected: deque<T> c; //底层容器,双端队列 public: //以下完全利用c的操作函数完成 bool empty() const { return c.empty(); } size_type size() const { return c.size(); } reference front() { return c.front(); } reference back() { return c.back(); } // void push(const value_type& x) { c.push_back(x); } void pop() { c.pop_front(); }Composition(复合)关系下的构造和析构 Container---->Component(左边包含右边) 构造由内而外 Container的构造函数首先调用Component的default构造函数,然后才执行自己。
Container::Container(...): Component() { ... }; //第二个...是要做的构造函数析构由外而内 Container的析构函数首先执行自己,然后才调用Component的析构函数。
Container::~Container(...) { ... ~Component() }; //第二个...是要做的析构函数其中的Component()和~Component()都是编译器帮我们完成的(包括顺序)。
Delegation(委托).Composition by reference(可以理解为外包)
class StringRep; class String { public: String(); String(const char* s); String(const String& s); String &operator=(const String& s); ~String(); ... private: StringRep* rep; //通过指针指向另外一个类,pimpl }; #include "String.hpp" namespace { class StringRep { friend class String; StringRep(const char* s); ~StringRep(); int count; char* rep; }; } String::String() { ... } ...Inheritance(继承),表示is-a
struct _List_node_base { _List_node_base* _M_next; _List_node_base* _M_prev; }; template<typename _Tp> struct _List_node : public _List_node_base { _Tp _M_data; };Inheritance(继承)关系下的构造和析构 构造由内而外 Derived的构造函数首先调用Base的default构造函数,然后才执行自己。
Derived::Derived(...): Base() { ... };析构由外而内 Derived的析构函数首先执行自己,然后才调用Base的析构函数。
Derived::~Derived(...) { ... ~Base() };注意:base class的dtor(析构)必须是virtual,否则会出现undefined behavior。 这里的构造和析构也是由编译器默认完成的,包括执行顺序。
