0%

代码重用

类的复用

上一节了解了public继承是is-a关系;C++ PRIMER第十四章重用讲解包含has-a的两种用法:1.组件包含 2.私有继承包含
大多数人会倾向于使用包含,一方面方便理解,另一方面多重继承容易引起问题;私有继承主要区别在于私有成员变成了继承而来的无名成员,调用成员时依赖this的类型转换。

多重继承

MI会带来许多新问题:1.两个基类的同名方法; 2.多个相关基类继承同一个类的多个实例问题;为此大家对MI有喜忧参半不同的态度。

祖先相同时,要用虚基类解决 class Singer:virtual public Worker,虚拟继承。禁止正常的信息再中间类自动传递。

MI中间隐含较多问题,尽量减少使用,要么就不用。

类模板

模板主要作用是提供参数化类型,将类型关键名作为参数传递给模板类或函数,从而实现最大程度代码复用。

模板类型使用指针时,代码实现上也得调整,所以一般减少依赖指针模板使用,尽量时bool,char,int,double,string,及一般对象等。

为容器类提供可重用代码是引入模板的主要动机。非类型参数可以是int,枚举,引用或指针,因此double m 不合法,但double *m是合法的。

模板多功能性,可用于基类,组件类以及其他模板的类型参数。

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
33
34
35
template <class T>
class ARray
{
private:
T entry;
...
};

template <class Type>
class GrowArray:public Array<Type> {...}; // inheritance

template <calss Tp>
class Stack
{
Array<Tp> ar; // use an Array<> as a component
...
};

// need a blank between > >, show differ from >> operator
Array < Stack<int> > asi; // an array of stacks of int

// 模板也可传参
template<class T, int n>
ArrayTP<T, n>::ArrayTP(const T & v)
{
for(int i=0;i<n;i++>)
ar[i] = v;
}

// 显示具体化,用于专用定义,优先匹配
template<> class Ic<char *>
{
private:
public:
};

模板参数类似函数参数,带有隐式显式转换及参数匹配规则。

友元类

两个类关系既不是is-a也不是has-a,但存在控制的关系如电视和遥控。则可以定义遥控为电视的友元类,能够合理范围内修改电视的私有和保护的部分。相当于友元类需要直到朋友类的数据细节乃至实现细节。