Skip to content

Latest commit

 

History

History
149 lines (101 loc) · 3.65 KB

面向对象高级编程(上)(三).md

File metadata and controls

149 lines (101 loc) · 3.65 KB

面向对象编程

要点:

  1. 三种关系:继承,复合,委托
  2. 继承有三种,public,private,protected
  3. 成员函数分三种,非虚函数,虚函数,纯虚函数

复合(composition):

强调has a,包含关系

protected:
    deque<T> c;//双端队列,可以从头尾insert和delete

适配器模式(adapter):用上面c中的函数代替当前类的函数的功能,如:

template<typename T>
class queue {
...
public:
    bool empty() const {return c.empty();}
    void pop() {c.pop_front();}
    ..
};

countainer的构造函数首先调用component的默认构造函数然后在执行自己,也就是说先构造dequeue然后再构造queue他自己,container的析构函数先析构自己然后再执行component的析构函数(就像造房子,先造内部然后再造外部,拆房子时,先拆外面,再拆里面),过程如下:

Container::Container():Component(){...};//编译器自动调用
Container::~Container(){~Component()};

委托(Delegation)-->Composition by referrence

内含指针

private:
    StringRep* rep;//pointer to implementation

share_ptr中的ref_count就是用这种模式实现的,后面的改变会影响前面的,比如:

shared_ptr<int> a(new int);//增加a的引用计数
shared_ptr<int> b(a);//增加a,b的引用计数
shared_ptr<int> c(b);//也应该增加a的引用计数也该增加b的引用计数

继承(inheritance)

表示is-a

struct list_node :
        public _list_node_base

构造方式有些像组合,先构造父类(内),再构造子类(外),析构相反,且base class的dtor必须是virtual的否则会出现未定义的行为

虚函数:

non-virtual函数:你不希望derived class重新定义(override
virtual函数:重新定义(override)父类的virtual函数
pure-virtual函数:你希望子类一定要重新定义
有virtual的函数在函数调用的时候会动态绑定该父类继承图里的类

class Shape{
public:
    virtual void draw() const = 0;//pure-virtual
    virtual void clear(){}//virtual
    int pos();//非virtual
};

委托+继承

解决多个用户共同被控制的问题,如下

class Subject {
    int val;
    vector<Observer*> m_views;
public:
    void attach(Observer* obs) {//将某个观察者与subject关联,以便对每个observer进行通知
        m_views.push_back(obs);
    }
    void set_val(int n) {
        val = n;
        notify();
    }
    void notify() {//通知每一个相关联的Observer,允许他们调用子类的方法进行更新
        for(int i = 0; i < m_views.size(); i++) {
            m_views[i]->update(this, m_value);
        }
    }
}
class Observer {
public:
    virtual void update(Subject* sub, int value) = 0;//设成纯虚函数,供子类设计
}

Subjecet类实现对一群Observer进行控制,若执行set_val,会通知每个Observer进行更新

该模式在容器的应用

   Component(父类)
   |||    |||
    V      V
    v      v
Primitive Composite(子类)

vector<Component*>//可以装下父类,子类指针的容器

继承关系下的构造和析构

构造方式有些像组合,先构造父类(内),再构造子类(外),析构相反,且base class的dtor必须是virtual的否则会出现未定义的行为

Component partBase part构造先后次序不一定,在当前编译器下是先BaseComponent,但该先后次序并不影响逻辑次序