OOP[GeekBand]

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容