Abstract
最近在看侯捷C++面向对象高级开发(上)。有兴趣的小伙伴可以去看看,讲的很好。侯捷老师介绍了c++ OOP设计的三板斧:
① Inheritance继承
② Composition 复合
③ Delegation 委托
Composition 复合
复合表示的是has-a.侯捷老师举了一个STL中的例子:
下面的Code来自Visual Studio:queue.h,和侯捷老师给的代码差不多
队列queue有一个数据元素是deque。queue has a deque。
用图表示两个类的关系是:
抽象出来:就是下图所示:
对与Composition关系来所:
构造函数:
Container的构造函数首先调用Component的default的构造函数,然后才执行自己的。
析构函数:
Container的析构函数首先执行自己,然后才调用component的析构函数。
其实这也很符合我们的期望。就好像洋葱一样:首先生成的是内部的皮,再生成外部的皮。剥洋葱的时候:是先剥外面的皮,再剥洋葱里面的皮。
Delegation 委托 (Composition by reference)
正如别名Composition by reference,这就是在Container里加一个Component的引用(指针).
这样做和Composition有什么不同呢?
Composition中的Container和Component的生命周期是一样的,也就是Container和Component是同时创建,同时析构。
但是Delegation中的生命周期是不同的
Inheritance 继承 is-a
同样的:
Virtual
继承中重要的一环就是虚函数Virtual function了。
这里梳理一下:
non-virtual: 不希望子类重新定义override
virtual: 希望子类重新定义,且你对它也有默认定义 virtual
pure virtual:子类必须重新定义 virtual function=0
其中base class 的析构函数必须是virtual 否则UB
我的一些想法
在刚开始没有听这个课,我是搞不清Composition和Inheritance的区别的。我觉得是差不多的。但现在我有了一些自己的总结
Inheritance有虚函数,而且可以用基类引用(指针)衍生类。
设计模式
老师讲了几种设计模式,当时我还以为设计模式是教你怎么写clean code。没想到设计模式是OOD(object oriented design)。我决定学设计模式了。
老师讲的设计模式是:
①Adapter
②Handle/Body
③Template
④Subject/Observer
⑤Composite
⑥Prototype
这里我就不记录了。文末贴了相应的图片。
探究
老师给出了这样三个类的关系:算算Derived的默认构造函数是怎么进行的
下面是测试代码:
//test.h
#ifndef __TEST__
#define __TEST__
#include<iostream>
using std::endl;
class base {
public:
base() {
std::cout << "base()" << endl;
}
~base() {
std::cout << "~base()" << endl;
}
};
class component {
public:
component() {
std::cout << "component()" << endl;
}
~component() {
std::cout << "~component()" << endl;
}
};
class derived :public base{
public:
derived() {
std::cout << "derived()" << endl;
}
~derived() {
std::cout << "~derived()" << endl;
}
private:
component c;
};
#endif
//test.cpp
#include "test.h"
int main()
{
derived();
return 0;
}
In Visual Studio:
In G++
看来是一样的