复合:一个类包含另一个类的成员实例;has a
Adapter采用复合的类间关系:把一个强大功能的类包装成一个功能减弱的类;或把一个功能弱的类扩展成功能强大的类。这里的Queue是先进先出的类,Deque是两端可以进出的类。
template <class T>
class Queue {
private:
Deque<T> d;
public:
void push(const T& e) {d.push(e);} //从队列的尾部添加一个元素
bool isEmpty() const {d.isEmpty();}
void pop() {d.pop();} //从队列的开头弹出/删除一个元素
}
复合关系中类构造和析构函数执行的先后顺序:
构造:先里后外,编译器首先会调用复合类默认的构造函数,如果需要调用其他的构造函数需要手动指定。
析构:先外后里,编译器会调用复合类默认的析构函数。
委托:创建的类包含另外一个类的指针
创建类的功能委托给另外类来实现;Handle/body(pImpl)
继承:is a
对于成员函数是调用权的继承。
struct结构体也可以有继承的关系
struct _List_node_base {
_List_node_base* next;
_List_node_base* prev;
};
template <typename TP>
struct _List_node : public _List_node_base {
TP * tp;
};
构造函数,先父类再子类;
析构函数:先子类再父类,且父类的析构函数必须是虚函数,否则会出现undefined behavior。
虚函数:
父类的函数从继承的角度可以分为三种:
非虚函数:不希望子类重新定义该函数。
虚函数:希望子类重新定义该函数,且父类对该函数有默认的定义。
纯虚函数:希望子类一定要定义它,且父类对该函数没有默认的定义。