本周主要学习了c++中类与类之间的关系,主要有:
1)继承(Inheritance);
2)复合(Composition);
3)委托(Delegation);
一、复合:
类 queue 里有 deque ,其中类 queue 为容器,其拥有了 deque,该种关系即为复合,表示 has-a。其两者一起出现。
从内存角度看待该种关系:
复合关系下的构造函数和析构函数:
构造函数由内而外:
Container 的构造函数首先调用Component的默认构造函数,然后才执行自己。具体过程如下:注意:调用Component的默认构造函数的过程将由编译器自动完成,但若想调用Component的非默认构造函数,则需要自己添加。
Container::Container(...) : Component() { ... };
析构由外而内:
Container 的析构函数首先执行自己,然后才调用Component 的析构函数,具体过程如下:
Container::~Container(...) { ...~Component() };
二、委托(用指针相连)
类 String 有一个指针指向StringRed,该种关系即为委托。 类String 可以在任何时间调用StringRed,将任务委托给StringRed。两者不同步,左边先创建,等到需要右边时才创建右边处出来。
三、继承(is a)
c++中有三种继承方式:private 继承、protected 继承和 public 继承,其中最重要的为public 继承。其基本语法如下图所示。
继承关系下的构造和析构:
构造由内而外:
子类的构造函数首先调用父类的默认构造函数,然后才执行自己。
析构由外而内:
子类的析构函数首先执行自己,然后才调用父类的析构函数。
继承搭配虚函数的使用:
1)非虚函数:父类中已有定义,子类不能重新定义它。
2)虚函数:父类中已有默认的定义,但子类需要时仍可重新定义。
3)父类中无定义,子类使用时一定要重新定义。
一个继承搭配虚函数使用的例子:
四、委托+继承的广泛应用
1)观察者模式
2)组合模式
典型应用场景 : windows的文件夹与文件系统,文件夹中又有文件
3)原型模式
应用场景 :原型模式是通过已经存在的对象的接口快速方便的创建新的对象。