類間關(guān)系主要分為:繼承(泛化)鸟款、實(shí)現(xiàn)膏燃、依賴、關(guān)聯(lián)何什、聚合组哩、組合
繼承(泛化)
A、B兩個類具有繼承的關(guān)系处渣,比如A是父類伶贰,B派生自A類,B是個子類罐栈。
代碼
class A
{
}
class B:A
{
}
UML圖
英文單詞Generalization
:泛化的意思
圖形表示:是一條實(shí)線黍衙,三角箭頭指向父類
應(yīng)用
這個就很廣泛了,在面向?qū)ο笞兂芍袘?yīng)用很廣泛荠诬,凡是具有子類和父類關(guān)系的都是繼承琅翻。
實(shí)現(xiàn)
通常某個類繼承了一個虛類。實(shí)現(xiàn)了虛類定義的函數(shù)柑贞。也就是結(jié)成了一個接口類方椎,然后實(shí)現(xiàn)接口類的成員函數(shù)。
代碼
class A
{
public:
void say(string&)=0;
}
class B:A
{
public:
}
UML圖
Interface Realization
圖形表示:不同軟件有不同的表示方法
應(yīng)用
java里面的接口類就是這么個玩意
依賴
A钧嘶、B兩個類棠众,B類中的某個函數(shù)中的返回值,或者參數(shù)是A類型有决,或相關(guān)的A*
闸拿、A&
轿亮。
依賴的含義是有聯(lián)系,另一層意思是胸墙,知道另外一個類的存在我注,可以使用另外的類。
但是迟隅,依賴并不是包含但骨,也就是說,并沒有一個類并沒有成員變量是它所依賴類的類型
代碼
class A
{
}
class B
{
public:
A* getA();
int isHold(A&);
private:
A _hold;//如果僅僅是依賴智袭,那么不應(yīng)該有這個成員變量奔缠。
}
UML圖
Dependence
圖形表示:一條虛線,箭頭指向所依賴的類吼野。
關(guān)聯(lián)
關(guān)聯(lián)比依賴的耦合度高一層校哎。同時也是包含的關(guān)系瞳步。
代碼
class A
{
}
class B
{
private:
A *a;
}
聚合
聚合是關(guān)聯(lián)的一種闷哆。也是一種包含被包含的關(guān)系单起。
聚合和組合相互區(qū)分。
聚合相對而言是一種實(shí)體的東西嘀倒,比如說汽車屈留,汽車有引擎、輪胎测蘑、方向盤。但是碳胳,引擎可以時不同的牌子的,可以時相同型號的任一個引擎固逗。同理浅蚪,輪胎和方向盤也是藕帜。
代碼
//直接寫在同一個文件里了
// ./A.h
#ifndef _A_H_
#define _A_H_
#include <iostream>
class A
{
public:
A()
{
std::cout<<"A()"<<std::endl;
}
};
#endif
// ./B.h
#ifndef _B_H_
#define _B_H_
#include <iostreBm>
#include "A.h"
clBss B
{
public:
B()
{
std::cout<<"B()"<<std::endl;
}
private:
A a;
A *pa;
};
#endif
// ./aggravate
#include <iostream>
#include "B.h"
int main()
{
B b;
B *pb;
return 0;
}
編譯以后烫罩,(如果是聲明與實(shí)現(xiàn)分開,那么在編譯的時候需要顯式的寫明A.cc
,B.cc
)
打印
A()
B()
說明贝攒,類在初始化的時候,并不會初始化他的指針類型的函數(shù)成員指向的數(shù)據(jù)類型隘弊,只會初始化他的值類型的成員變量,指針本身還是會分配內(nèi)存地址的梨熙。
這好像是類初始化的東西了。
UML圖
aggravate
圖形表示:一條實(shí)現(xiàn)咽扇,空心菱形指向所依賴的類
應(yīng)用
聚合關(guān)系中,類的成員函數(shù)和該類的生命周期并不同质欲。
在觀察者模式中,使用weak_ptr<>
嘶伟。
拓展
聚合類
聚合類
- 沒有用戶定義的構(gòu)造函數(shù)
- 沒有私有和受保護(hù)的非靜態(tài)成員
- 沒有虛函數(shù)
- 沒有基類
struct A
{
char ii;
int i;
C c
}
A a={'a',11,{/*聚合類C的初始化*/}};
應(yīng)用的話,還不知道绊袋。和c的結(jié)構(gòu)體很像啊。
組合
組合和聚合要區(qū)分愤炸。
組合的的意思多指抽象體掉奄。比如一個公司和部門的關(guān)系规个,公司和部門不能拆分姓建,誰離開誰都是這個公司的完結(jié)。也就是說速兔,類和它所包含的數(shù)據(jù)成員有共同的生命周期,且不能替換涣狗。
代碼
和聚合相同。
UML圖
composition
圖形表示:一條實(shí)線穗熬,實(shí)心菱形
關(guān)聯(lián)
關(guān)聯(lián)有兩種,組合和聚合
從關(guān)聯(lián)方式上分為三種:單向關(guān)聯(lián)唤蔗,雙向關(guān)聯(lián),自身關(guān)聯(lián)妓柜。
當(dāng)A、B兩個類之間相互知道對方的存在時棍掐,使用雙向關(guān)聯(lián)。也通常是使用的雙向關(guān)聯(lián)作煌。、
代碼就是在雙方的類中包含有對方的類的類型最疆。
UML
UML圖不同軟件的原因,表現(xiàn)形式不同服爷,但是主要的特征不變
- 實(shí)現(xiàn):
- 依賴:虛線+箭頭
- 集成:實(shí)線+空心三角
- 聚合:實(shí)線+空心菱形
- 組合:實(shí)線+實(shí)心菱形