has-a 就是这样:组合关系
is-a 就是 继承关系
1
2
3
4
5
6
7
8
|
class
one{..};
class
two
{
private
:
class
one;
};
|
is-a 就是 继承关系
1
2
3
|
class
base{..};
class
drivate :
public
base{..};
|
and use-a maybe looks like
1
2
3
4
5
6
7
8
9
10
11
|
class
other
{
//...
public
:
void
func();
};
class
another{
public
:
void
test(
const
other & o) { o.func();};
};
|
use-a关系
如果类A与类B是 use-a 关系,则A具有类型为B、B&、const B&、B*、const B*的一个成员,或者是可以轻易以上述对象之一
返回一个B的函数。于是A可以使用B的程序和数据。
has-a关系
has-a 类似于 use-a,不同之处在于,A负责构建和销毁B并在它的生存期使用它。
is-a关系
如果类A和类B是 use-a 关系,则B必须是A的抽象。is-a的关系通常出现在公共派生的C++中
实现关系
如果类A与接口M是实现关系,则它实现了M所有的纯虚函数。接口实现是Symbian OS中唯一使用多重继承的地方。
如果类A与类B是 use-a 关系,则A具有类型为B、B&、const B&、B*、const B*的一个成员,或者是可以轻易以上述对象之一
返回一个B的函数。于是A可以使用B的程序和数据。
has-a关系
has-a 类似于 use-a,不同之处在于,A负责构建和销毁B并在它的生存期使用它。
is-a关系
如果类A和类B是 use-a 关系,则B必须是A的抽象。is-a的关系通常出现在公共派生的C++中
实现关系
如果类A与接口M是实现关系,则它实现了M所有的纯虚函数。接口实现是Symbian OS中唯一使用多重继承的地方。
use-a:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#include <iostream>
enum
SHOW_TO_DEVICE {DEVICE_SCREEN, DEVICE_PRINTER};
class
device {
public
:
virtual
~device() {}
virtual
void
show() = 0;
};
class
screen :
public
device {
public
:
virtual
~screen() {}
virtual
void
show() {
std::cout <<
"screen::show()"
<< std::endl;
}
};
class
printer :
public
device {
public
:
virtual
~printer() {}
virtual
void
show() {
std::cout <<
"printer::show()"
<< std::endl;
}
};
class
document {
public
:
void
show(SHOW_TO_DEVICE dev) {
device *the_device = make_device(dev);
the_device->show();
destroy_device(the_device);
}
private
:
device *make_device(SHOW_TO_DEVICE dev) {
switch
(dev) {
case
DEVICE_SCREEN:
return
new
screen;
case
DEVICE_PRINTER:
return
new
printer;
}
}
destroy_device(device *ptr) {
delete
ptr;
}
};
int
main() {
document doc;
doc.show(DEVICE_SCREEN);
return
0;
}
注意一下 make_device()
|
|
|