主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语
一:组合 Composition
1.定义: has-a的关系,一个类中有包含另外一个类 (类中的成员变量之一是类),是包含一个对象,而不是包含一个指针,如果你组合了这个类,那么你就将拥有你包含的类的全部功能
#include
#include
template
class queue {
...
protected:
std::deque c; // 底層容器 has-a的关系
public:
// 以下完全利用 c 的操作函數完成
bool empty() const { return c.empty(); }//利用deque的功能来实现queue新定义的功能
size_t size() const { return c.size(); }
reference front() { return c.front(); }
reference back() { return c.back(); }
void push(const value_type& x) { c.push_back(x); }
void pop() { c.pop_front(); }
};
2.用类图表示has-a的模式,Container(容器) Component(组成部分 part) Container has Component
3.has-a composition 内存管理
template
class queue {
protected:
deque c;
...
};
template
class deque {
protected:
Itr start; //16 bit
Itr finish; //16 bit
T** map; //4bit
unsigned int map_size; //4bit
};
template
struct Itr { struct Itr {
T* cur; //4bit
T* first;
T* last;
T** node;
...
};
所以是queue的内存为40bit
4.构造与析构
Container 的构造函数首先调用 Component 的 default 构造函数,然後才执行自己 的构造函数,可以理解成
如果不要使用Commponent的default构造函数函数,就必须显式调用Component的构造函数
Container::Container(...): Component() { ... };
Container 的析构函数首先执行自己的,然后调用 Component 的 析构函数,可以理解成这样
Container::~Container(...){ ... ~Component() };
Container于Component具有相同的生命周期
二.聚合 也就是委托关系
1.定义has-a pointer,一个类中包含另一个类的指针,你也同样拥有被包含类的全部功能,他有一个重要的使用方法handle/body(pImpl)
class StringRep;
class String {//handle
public:
String();
String(const char* s);
String &operator=(const String& s); ~String();
....
private:
StringRep* rep; // pimpl
};
class StringRep { //body
friend class String;
StringRep(const char* s);
~StringRep();
int count;
char* rep;
};
功能其实与组合非常相似
2.类图
3.内存管理
4.构造与析构
5.生命周期
三.继承
1.定义is-a的关系,分为父类(Base)和子类(Drived),可以理解成孩子继承父亲的财产,就是父类有的子类都可以有,也可以理解成子类有父类的成分
class _List_node_base
{
...
_List_node_base* _M_next;
_List_node_base* _M_prev;
...
};
template
class _List_node: public _List_node_base
{
_Tp _M_data;
};
2.类图
3.内存管理
4.构造与析构
Derived::Derived(...): Base() { ... };
Derived::~Derived(...){ ... ~Base() };
5.继承真正的使用是与虚函数的搭配
void func_1();//non-virtual
virtual void func_2();//virtual
virtual void func_3() = 0;//pure virtual
四 .组合+继承
sample code
#include
using namespace std;
class Base{
private:
int B_num;
public:
Base(int val):B_num(val){
cout << "This is Base !!! "<< B_num << endl;
}
void V_test()
{
cout <<"This is V_test!!"<