C++面向对象(四)Inheritance, Composition, Delegation

一、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(...)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值