C++继承-复合-委托

1.继承Inheritance,表示is-a

struct _List_node_base
{
    _List_node_base* _M_next;
    _List_node_base* _M_prec;
};

template<typename _Tp>
struct _List_node : public _List_node_base
{
    _Tp _M_data;    
};

C++继承-复合-委托_第1张图片
子类指向父类
继承也可以有public protected private
继承最有价值的点是和虚函数的搭配使用
C++继承-复合-委托_第2张图片
继承下的构造和析构
父类的析构函数必须是虚函数
一个良好的习惯是只要该以后会成为父类,那么它的析构函数就需要成为虚函数不virtual

2.复合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();}
    //先出先出,只开放了deque的两个功能
    void push(const value_type& x){c.push_back();}
    void pop(){c.pop_front();}
}

C++继承-复合-委托_第3张图片
C++继承-复合-委托_第4张图片

抽象出Composition关系
构造由内而外,首先调用里面的deque的默认构造函数
析构是先析构自身,再调用deque的析构函数

生命周期:同时

3.委托Delegation

Composition by reference.

//file String.hpp
class StringRep;
class String{
public:
    String();
    String(const char* s);
    String(const String& s);
    String &operator=(const String& s);
    ~String();
...
private:
    StringRep* rep;//pimpl  存在一个指针指向StringRep
};

在任意一个时间点,都可以使用StringRep,委托给StringRep

//file String.cpp
#include "String.hpp"
namespace{
    class StringRep{
        friend class String;
        StringRep(const char* s);
        ~StringRep();
        int count;
        char* rep;    
    };
}
String::String(){...}
...

左边对String的实现永远交给StringRep,而它只开放拷贝构造赋值
point to implementation 指针指向具体实现 (Handle、Body)
设计手法:左边对外不变,右边对类的实现(就可以任意切换)【编译防火墙】

C++继承-复合-委托_第5张图片
生命周期:先有String,需要用的时候才有StringRep

C++继承-复合-委托_第6张图片
有String a ; String b;String c;
同时指向StringRep,StringRep里面使用引用计数,共享同一个Hello

Copy On Write概念
当a想要改变rep里面的值时,那么rep就拷贝构造出一份出来,让a单独地改动
b,c依旧共享rep

4.继承+复合关系下的构造和析构

C++继承-复合-委托_第7张图片

5.委托+继承

class Subject
{
    //真正的data位置
    int m_value;
    vector<Observer*> m_views; //委托delegation
public:
    //注册观察者
    void attach(Observer* obs)
    {
        m_views.push_back(obs);
    }
    void set_val(int value)
    {
        m_value = value;
        notify();    
    }
    //通知所有观察者,更新value
    void notify()
    {
        for(int i = 0;i < m_views.size();++i)  
            m_view[i]->update(this,m_value);  
    }
}

Observer,让Subject可以拥有多个Observer
就像ppt一样

C++继承-复合-委托_第8张图片
像上图中就是有四个Observer在观察同一个矩形

class Observer
{
public:
    virtual void update(Subject* sub,int value)=0;
};//Observer可以被继承

C++继承-复合-委托_第9张图片

–学习自侯捷老师

你可能感兴趣的:(c++,开发语言,java)