侯捷C++手把手教学:复合,委托,继承

    科技2026-04-13  7

    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。 这里的构造和析构也是由编译器默认完成的,包括执行顺序。

    Processed: 0.009, SQL: 9