C++ OOP设计基础

Abstract

最近在看侯捷C++面向对象高级开发(上)。有兴趣的小伙伴可以去看看,讲的很好。侯捷老师介绍了c++ OOP设计的三板斧:
① Inheritance继承
② Composition 复合
③ Delegation 委托


Composition 复合

复合表示的是has-a.侯捷老师举了一个STL中的例子:
下面的Code来自Visual Studio:queue.h,和侯捷老师给的代码差不多
C++ OOP设计基础
队列queue有一个数据元素是deque。queue has a deque。
用图表示两个类的关系是:
C++ OOP设计基础
抽象出来:就是下图所示:
C++ OOP设计基础
对与Composition关系来所:
构造函数:
Container的构造函数首先调用Component的default的构造函数,然后才执行自己的。
析构函数:
Container的析构函数首先执行自己,然后才调用component的析构函数。
其实这也很符合我们的期望。就好像洋葱一样:首先生成的是内部的皮,再生成外部的皮。剥洋葱的时候:是先剥外面的皮,再剥洋葱里面的皮。
C++ OOP设计基础



Delegation 委托 (Composition by reference)

正如别名Composition by reference,这就是在Container里加一个Component的引用(指针).
这样做和Composition有什么不同呢?
Composition中的Container和Component的生命周期是一样的,也就是Container和Component是同时创建,同时析构。
但是Delegation中的生命周期是不同的
C++ OOP设计基础


Inheritance 继承 is-a

C++ OOP设计基础
同样的:
C++ OOP设计基础

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
这里我就不记录了。文末贴了相应的图片。


探究

C++ OOP设计基础
老师给出了这样三个类的关系:算算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:
C++ OOP设计基础
In G++
C++ OOP设计基础
看来是一样的







C++ OOP设计基础
C++ OOP设计基础
C++ OOP设计基础
C++ OOP设计基础
C++ OOP设计基础