03 C++中复合、委托和继承的基本用法

1、引言

本篇内容主要是介绍C++中类与类之间Composition(复合)、Delegation(委托)和Inheritance(继承)的基本设计模式,如Adapter、pimpl、Template Method、Observer、Composite和Prototype。

2、Composition的用法

1) Contaner与Compoent

03 C++中复合、委托和继承的基本用法

2)两者间关系

03 C++中复合、委托和继承的基本用法

注意点:

a、这是一种Adapter(适配器)的设计模式,适用于只开放部分类方法的情形,且在Adapter中实现部分方法的调用,是对一个类的封装的用法;

b、Contaner的构造函数首先调用Component的默认构造函数,然后才执行自己;

c、Container的析构函数首先执行自己,然后才调用Component的析构函数;

d、构造函数与析构函数是内外同步的。

3、Delegation(Composition by reference)的用法

1)、Handle/Body

03 C++中复合、委托和继承的基本用法03 C++中复合、委托和继承的基本用法

2)两者间关系

03 C++中复合、委托和继承的基本用法

注意点:

a、这种委托的实现方式是通过pimpl(point to implementation)设计模式实现,即通过针对变量指向一个类;

b、构造函数和析构函数在两者间是不同步的;

c、Handle部分提供的是接口部分,底层可以通过Body部分实现不同的操作;

4、Inheritance的用法

1)继承的关系

03 C++中复合、委托和继承的基本用法

注意点:

a、构造函数由内而外,即Derived的构造函数首先调用Base的默认构造函数,然后才执行自己;

b、析构函数由外而内,即Derived的析构函数首先执行自己,然后才调用Base的析构函数;

c、base类的析构函数必须是virtual,否则会出现未定义的行为。

2)继承与虚函数

通过类成员函数有三种:非虚函数、虚函数和纯虚函数。

  • 非虚函数:不希望派生类重新定义;
  • 虚函数:有默认的定义,希望派生类重新定义;
  • 纯虚函数;没有默认的定义,派生类一定要重新定义。
03 C++中复合、委托和继承的基本用法
3)Template Method设计模式
03 C++中复合、委托和继承的基本用法
注意点:
a、这是一种Template Mothod的设计模式,适用于有通用部分的函数和具体特殊的实现函数,这样通用部分的函数代码在框架中实现,具体特殊函数代码用继承虚函数实现;
4)继承与复合关系的构造与析构
03 C++中复合、委托和继承的基本用法
注意点:
a、构造函数由内而外,即Derived的构造函数首先调用Base的默认构造函数,然后调用Component的默认构造函数,最后次执行自己;
b、析构函数由外而内,即Derived的析构函数首先执行自己,然后调用Component的析构函数,最后调用Base的析构函数。
5)委托与继承的设计模式
03 C++中复合、委托和继承的基本用法

关系:
03 C++中复合、委托和继承的基本用法
注意点:
a、这是一种Observer的设计模式,适用于如有一份文件,多个窗口查看或者一份数据,有多种视图显示;;
b、示例中Subject是数据类,Observer是显示类,可以被多个observer继承实现不同方式的查看。

5、委托的其它相关设计模式

1)Composite
03 C++中复合、委托和继承的基本用法
注意点:
a、这是一种Composite的设计模式,要使Composite类中容器能容纳左边和右边的数据,所以设计一个Component的父类;
b、容器中只能放指针对象,因为指针的大小相同;
2)Prototype(原型)
03 C++中复合、委托和继承的基本用法
注意点:
a、这是Prototype的设计模式,主要适用于现在创建未来的class对象,因不清楚未来类的名字;
b、未来对象是通过原型来创建的(必须运用事先搭好的框架),首先创建静态的对象,然后调用默认构造函数来通过原型创建对象。
c、类中的静态变量要在类外部定义。