1 面向?qū)ο蟮娜汛蟮?-復(fù)合、委托和繼承
1.1復(fù)合(Composition)
1.1.1 定義
復(fù)合表示的是has-a的關(guān)系。在實現(xiàn)類中包含有復(fù)合類的一個完整實體,是一種類與類之間強(qiáng)的關(guān)系。在UML圖示中用實心菱形表示。代碼示例如下:
class A;
class B{A a;}
1.1.2 復(fù)合關(guān)系下的構(gòu)造和析構(gòu)
- 構(gòu)造由內(nèi)而外
復(fù)合關(guān)系下的構(gòu)造函數(shù),先執(zhí)行復(fù)合類的默認(rèn)構(gòu)造函數(shù),在執(zhí)行自身的構(gòu)造函數(shù)體。如果不希望調(diào)用復(fù)合類的默認(rèn)構(gòu)造函數(shù)或者復(fù)合類沒有默認(rèn)構(gòu)造函數(shù),則要在初始化列表中做顯示的初始化。如下:
class A{
int x;
public:
A(int _x):x(_x){}
}
class B{
A a;
int _y;
public:
B(int x,int y):a(x),_y(y){}
};
- 析構(gòu)由外而內(nèi)
復(fù)合關(guān)系下的構(gòu)造函數(shù),先執(zhí)行自身的析構(gòu)函數(shù),在執(zhí)行復(fù)合類的析構(gòu)函數(shù)。
1.2 委托(Delegation) Composition by reference
委托表示的也是has-a的關(guān)系。在實現(xiàn)類中包含有委托類的一個引用,是類與類之間比較弱的關(guān)系,在UML圖示中用空心棱形表示。代碼示例如下:
class A;
class B{
A *p;
}
1.3 繼承(Inheritance)
1.3.1 定義
類通過繼承聯(lián)系在一起構(gòu)成一種層次結(jié)構(gòu)。在這種層次結(jié)構(gòu)中,頂層的類叫做父類或基類;其他類則直接或間接的從基類繼承而來,這些繼承而來的類稱為派生類或子類。在UML圖示中用空心三角形表示。
在C++中,繼承有三種實現(xiàn)方式,公有繼承(public),保護(hù)繼承(protected)和私有(private)繼承。通過在類派生列表中指定。派生列表的形式為class drived_class:public A,protected B,private C。類派生列表中的訪問說明符并不影響直接子類訪問父類的成員,而是限制子類的客戶訪問基類的成員。也就是說,當(dāng)使用Private繼承基類C時,子類依然可以訪問父類C的公有成員和保護(hù)成員,但是子類的子類及子類的調(diào)用者則無法訪問基類C中的所有成員,包括C中的公有成員。因為,子類按Private從父類繼承成員時,將父類所有的成員都繼承為自己的Private成員,因此類的用戶就無法調(diào)用。
注意:一般情況下,都是用Public繼承,Protected和private很少用。
1.3.2 繼承關(guān)系下的構(gòu)造和析構(gòu)
- 構(gòu)造由內(nèi)而外
繼承關(guān)系下的構(gòu)造函數(shù),先執(zhí)行父類的默認(rèn)構(gòu)造函數(shù),在執(zhí)行自身的構(gòu)造函數(shù)體。如果不希望調(diào)用復(fù)合類的默認(rèn)構(gòu)造函數(shù)或者復(fù)合類沒有默認(rèn)構(gòu)造函數(shù),則要在初始化列表中做顯示的初始化。如下:
class A{
int x;
public:
A(int _x):x(_x){}
}
class B:public A{
A a;
int _y;
public:
B(int x,int y):a(x),_y(y){}
};
- 析構(gòu)由外而內(nèi)
繼承關(guān)系下的構(gòu)造函數(shù),先執(zhí)行自身的析構(gòu)函數(shù),在執(zhí)行父類的析構(gòu)函數(shù)。
2 虛函數(shù)與多態(tài)
2.1 虛函數(shù)
2.1.1 虛函數(shù)定義
對于某些函數(shù),如果基類希望子類實現(xiàn)符合各自需求的版本,那就可以把這些函數(shù)聲明為虛函數(shù)。子類必須在其內(nèi)部實現(xiàn)中隊重新定義的虛函數(shù)進(jìn)行聲明。聲明虛函數(shù)時,需要在函數(shù)聲明的前面添加virtual,如virtual void a_virt_func();。
2.1.2 虛函數(shù)使用場景
- non-virtual函數(shù)
你不希望子類重新定義(override)父類的函數(shù)。 - virtual函數(shù)
你希望子類重新定義(override)它,但是希望它有默認(rèn)定義。 - pure virtual函數(shù)
你希望子類重新定義(override)它,但是對他沒有默認(rèn)的定義。
2.2 多態(tài)
多態(tài)是OOP的核心思想,意思為“多種形式”。我們把具有繼承關(guān)系的多個類型稱作多態(tài)類型,因為我們能使用這些類型的“多種形式”而無須在意他們之間的差異。在C++中,引用和指針的動態(tài)類型和靜態(tài)類型的不一致正是實現(xiàn)這一機(jī)制的關(guān)鍵。
參考資料:
1.GeekBand課件
2.cpp primer 5th edition