復合,繼承,委託

2021-08-09 06:37:10 字數 1716 閱讀 8416

復合其實是一種 has-a 的關係,就是說乙個類裡面有其他類的物件

例如在stl標準庫的實現中,queue裡面有乙個deque

template

class

queue

size type size() const

//void push(const value_type& x)

void pop()

};

queue的一些功能完全借助deque來實現。

復合關係下的構造與析構

建構函式是由內而外

container的建構函式首先呼叫component的default建構函式(編譯器幫助我們做的)

然後才執行自己

container::container:component()
析構是由外而內

container的析構函式首先執行自己,然後才呼叫component的析構函式

container::~container;
如果不想呼叫另乙個物件的預設建構函式,那就要顯示呼叫

繼承是一種 is-a 的關係,

基類中函式有三種:

- 普通函式

- 虛函式

- 純虛函式

其中,如果在基類中寫成純虛函式,那麼派生類(derived class)中一定要重新定義該函式,就是說派生類要有該虛函式的自己的版本

如果是虛函式,那麼在基類中已經有了預設定義,派生類中可以選擇重新定義。

public繼承下,父類中的資料是被完全繼承下來的。

繼承關係的構造與析構

構造由內而外

析構由外而內

繼承關係下構造與析構順序與復合關係下相同。

當乙個類同時有繼承和復合時,是先呼叫基類的建構函式還是另乙個復合的類的建構函式呢?

析構函式的順序呢?誰先誰後並不重要,只是看一下。

乙個測試程式看一下結果

#include 

using

namespace

std;

class base

~base()

};class com

~com()

};class test:public base

~test()

com ch;

};int main()

以下是在windows下使用dev-c++,gcc 4.9.2的執行結果:

建構函式執行順序是先執行基類的建構函式,再執行復合的物件的建構函式

析構函式執行順序是先執行復合的物件的析構函式,再執行基類的析構函式

以上說明基類是「最裡面的」

也剛好驗證了上面所說的構造是由內到外,析構是由外到內

a類中有一根指向另乙個類b的指標

當建立a類物件時,b類物件並不被也建立,而在復合關係中,兩個類的物件是同時建立

委託關係可以委託b類幫自己具體實現,

這種方法有個名詞pimpl(pointer to implementation),簡單理解就是介面與實現分離
(後面繼續再整理)

復合 委託(關聯) 繼承

在這個例子中,queue類中包含了deque類,並且開放了部分的deque的介面,這種乙個類裡面完整的包含了某個類的關係叫做復合。同時該種關係的類圖也已經在圖上呈現,是乙個黑色實心的菱形。deque的生命週期也完全由queue管理。這一點從底層的記憶體分布上可以更清楚的看出來 每乙個上層的類在記憶體...

繼承 or 復合?

django已經連續寫了很多篇,這裡先暫停一下,換換口味,實際上有了之前的簡單介紹,如果有一些web開發基礎的,已經可以開發了。後續我還會寫一些文章進行說明。今天介紹的內容在開發中很有意義,所以拿出來和大家聊聊,希望對大家今後的工作有所幫助。繼承是物件導向的重要概念,是依賴關係的一種,主要用來實現類...

多型 繼承 復合

1.為什麼建立的son物件可以給father類的指標賦值?賦值相容規則 可以用父類的指標指向子類的物件。inte ceson father father laowang son alloc init 在通過物件指標去呼叫方法的時候,我們不看指標是什麼型別的指標,只看指標所指向的物件。多型。多型的基礎...