C++面向对象(四)Composition, Delegation, Inheritance
一、Composition(复合)
- 关系表示为:has-a
template <class T, class Sequence = deque <T> >
class queue{
...
protected:
Sequence 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 是两端进出,queue 是末端进前端出(先进先出)
void push(const value_type& x){
c.push_back(x);
}
void pop(){
c.pop_front();
}
}
由图可知,queue里面直接包含了deque,所以为复合关系。且其为同时存在的,一有container,便马上也有了component。
其中为一种设计模式:Adapter
从内存的角度看,也体现其包含复合的关系:
- 其构造和析构的关系
(1)构造由内而外 (从里面开始一层一层搭建)
container的构造函数首先调用Component的 default 的构造函数,然后才执行自己。
Container::Container(...):Component(){
...};
(2)析构由外而内 (从外面开始一层一层剥离)
container的析构函数首先执行自己,然后才调用Component的析构函数。
Container::~Container(...){
... ~Component(){
...}};
注意:我们在写Container的构造或析构函数时,无需将Component的也加进去,因为红色部分是编译器自动帮我们加进去的。
二、Delegation(委托)
- 其关系表示为:composition by reference
可以类似看成一种,由指针相连,指针包含的复合,而指针一般在学术界是用引用来描述的。
其跟上面Composition有类似的地方,但不同的一点是,其左边包含拥有的右边并不是同时产生同时存在的,即左边的先创建,右边的只有当指针有使用、调用到时才产生右边的函数对象(不同步),因而成为委托的关系。左边只是对外的接口(保持不变的),真正的实现在右边操作(可变动的),也称为编译“防火墙”。
三、Inheritance(继承)
- 其表示关系为:is-a
继承有三种:public,private,protected
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_date;
};
关系如图:
- 其构造和析构的关系
(1)构造由内而外 (从里面开始一层一层搭建)
Derived的构造函数首先调用Base的 default 的构造函数,然后才执行自己。
Derived::Derived(...):Base(){
...};
(2)析构由外而内 (从外面开始一层一层剥离)
Derived的析构函数首先执行自己,然后才调用Base的析构函数。
Derived::~Derived(...)