復合其實是一種 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 在通過物件指標去呼叫方法的時候,我們不看指標是什麼型別的指標,只看指標所指向的物件。多型。多型的基礎...