- 三种关系:继承,复合,委托
- 继承有三种,public,private,protected
- 成员函数分三种,非虚函数,虚函数,纯虚函数
强调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()};
内含指针
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的引用计数
表示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 part 和Base part构造先后次序不一定,在当前编译器下是先Base后Component,但该先后次序并不影响逻辑次序