物件導向程式設計系列六 控制代碼類

2022-09-14 06:48:12 字數 2353 閱讀 3149

(1)控制代碼類

前面的章節中提到,在繼承體系中,從派生類物件到基類物件的轉換中最終得到的是乙個基類物件,派生類的部分會被切掉,而對應的指標或引用的轉換則並不改變派生類物件,而是將指標或引用繫結到派生類物件中,這樣一來才可以實現執行時的動態繫結,如下:

1

void get_prices(item_base obj, const item_base* pi, const item_base&ri)

2

上面的**中,obj是基類物件,無論傳進來的是基類物件還是派生類物件,最終都會成為基類物件,呼叫的也只能是基類的net_price成員函式;而第5行和第6行的指標和引用呼叫的函式則在執行時根據動態型別確定。所以,某些情況下,指標或引用能完成物件不能完成的任務,有更好的適用性,但是使用指標或引用會增加使用者的負擔,比如指標所指物件的釋放等,為此,可以使用一種通用的技術——包裝類或控制代碼類。控制代碼類儲存和管理基類指標,指標所指物件的型別可以是基類型別物件也可以是派生類型別物件,虛成員的行為將在執行時根據控制代碼實際繫結的物件型別確定,控制代碼的使用者可以獲得動態行為且無須擔心指標的管理。

(2)指標型控制代碼

控制代碼類包裝了繼承層次,如定義控制代碼類sales_item來包裝繼承如下繼承層次:

1

class bulk_item : public

item_base

2;

通常控制代碼類sales_item需要三個建構函式:預設建構函式,複製建構函式和接受item_base物件的建構函式。當複製sales_item物件或給sales_item物件賦值時,將複製指標而不複製物件。指標型控制代碼類使用計數來管理副本,如圖所示,sales_item類有兩個資料成員,都是指標:乙個指標指向item_base物件,另乙個指向使用計數,多個sales_item物件可以共享同一計數器:

(3)複製未知型別的物件給控制代碼類物件

如上面所示,控制代碼類通常有乙個接受item_base物件的建構函式,這個物件可能是基類型別物件也可能是派生類型別物件,因而這個建構函式需要在不知道物件的確切型別時分配已知物件的副本。為了支援這種情況,需要從基類開始,在繼承層次的每個型別中增加clone,並將該函式定義為虛函式:

1

class

item_base28

//...9};

1011

class bulk_item : public

item_base

1218 //

...19 };

對應的控制代碼類中的建構函式:

1 sales_item::sales_item(const item_base&item)

2 :p(item.clone()),use(new size_t(1))3

(4)控制代碼類定義控制代碼類使用計數來表示有多少個控制代碼類在使用同一item_base物件(也可以是派生類物件),每通過複製或賦值產生乙個新的sales_item副本,計數加1,注意賦值操作中計數的變化,應使其也適合自賦值的情形;控制代碼類還應定**引用操作符和箭頭操作符。控制代碼類sales_item的定義如下:

1

#ifndef sales_item

2#define sales_item

34 #include "

item_base.h

"5 #include "

bulk_item.h"6

7class

sales_item

814 sales_item(const item_base&item)

15 :p(item.clone()), use(new size_t(1

))16

18 sales_item(const sales_item&i)

19:p(i.p),use(i.use)

2023 sales_item& operator=(const sales_item&rhs)

2431

const item_base* operator->() const

3236

const item_base& operator*() const37

41private

:42 item_base *p;

43 size_t *use;

44void

decr_use

4551}52

};53

54#endif

view code

物件導向程式設計上機練習六(類和物件)

time limit 1000ms memory limit 65536kb submit statistic problem description 用類成員函式完成5個整型陣列元素的輸入 從小到大排序 排序後陣列元素的輸出。input 輸入5個陣列元素。output 輸出5個陣列元素從小到大排序...

物件導向程式設計上機練習六(類和物件)

time limit 1000ms memory limit 65536kb submit statistic problem description 用類成員函式完成5個整型陣列元素的輸入 從小到大排序 排序後陣列元素的輸出。input 輸入5個陣列元素。output 輸出5個陣列元素從小到大排序...

物件導向程式設計上機練習六(類和物件)

problem description 用類成員函式完成5個整型陣列元素的輸入 從小到大排序 排序後陣列元素的輸出。input 輸入5個陣列元素。output 輸出5個陣列元素從小到大排序後的結果。最後乙個數後面既沒有空格也沒有換行 example input 8 9 1 5 4 example o...