类之间的关系

类之间的关系有composition(has-a),delegation(委托)等.

Composition

1568621834620

构造由内而外,如Container中包含Component,那么Container的构造函数首先调用Conponent的default构造函数,然后才执行自己.
析构由外而内,Container的析构函数首先执行自己,然后调用Component的析构函数.
Adapter设计模式,queue中内含一个deque,就是一种adapter.queue实现的所有功能都是通过转调用deque的相应功能实现的,但是deque还有很多功能未被使用.

Delegation

1568621898856

两个类之间用指针相连,称之为delegation.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// handle/Body: file1为handle,file2为Body

// file1 String.hpp:对外接口
class StringRep;

class String {
public:
String();

String(const char *s);

String(const String &s);

String &operator=(const String &s);

~String();

private:
StringRep *rep; // pimpl:pointer to implementation
};

// file2 String.cpp:字符串真正的实现在这里
class StringRep {
friend class String;

StringRep(const char *s);

~StringRep();

int count;
char *rep;
};

无论字符串的实现如何变化,都不影响客户端代码.String中的StringRep也可以指向不同的StringRep的实现,如可以指向StringRep的子类.

1568622559010

三个string共享一个字符串hello,所以共享计数n=3表示有三个String对象共享hello.

继承

1568622819571

继承有三种方式:public,private,protected.其中public表示is-a关系.
构造由内而外.Derived的构造函数首先调用Base的default构造函数,然后才执行自己.
析构由外而内.Derived的析构函数首先执行自己,然后才调用Base的析构函数.

函数的继承继承的是调用权.当一个类B以public方式继承另一个类A,那么在类A中所有的public方法在类B中也会变成public,但是当B以private方式继承类A,那么类A中所有的public方法在类B方法中变成private方法.

参考文献

[1]基本聚合和组合聚合:https://www.ibm.com/developerworks/cn/rational/rationaledge/content/feb05/bell/index.html