C C 程式設計 模板與多重繼承的互補

2021-10-12 04:12:51 字數 1734 閱讀 8215

temporysecretaryclass繼承自secretarytempory,因此它同時擁有後兩者的特性,以及其他可能的更多特性。這導致一種想法:多重繼承可能有助於處理」設計組合「----通過少量的、明確選擇後的基類。這麼一來,使用者藉由basesmartptr、multithreaded和refcounter,就可以製作出具有多執行緒能力、引用計數功能的智慧型指標。不過,任何一位有經驗的類設計者都知道,這樣天真的設計方式其實無法運作。

分析多重繼承的失敗原因,有助於產生根據彈性的設計,這可以對健全的設計方案提供一些有趣的想法。通過多重繼承機制來組合多項功能,會產生如下問題:

雖然本質上是組合,但是多重繼承無法單獨解決設計時的多樣性選擇

注意:c++並不提倡多重繼承

模板是一種很適合」組合各種行為「的機制,主要是因為它們是」依賴使用者提供的型別資訊「並且」在編譯期才產生「的**

和一般的類不同,類模板可以以不同的方式定製。如果想要針對特定情況來設計類,你可以在你的類模板中特化其成員函式。舉個例子,如果有乙個smartptr,你可以針對smartptr特化其任何成員函式。這可以為你在設計特化行為時提供更好的粒度。

甚至,對於帶有多個引數的類模板,你可以採用偏特化。它可以讓你根據部分引數來特化乙個類模板。比如:

template

<

classt,

class

u>

class

smartptr

;

你可以令smartptr< t, u>針對widget以及其他任意型別加以特化:

template

<

class

u>

class

smartptr

;

模板的編譯期特性以及」可相互組合「特性,使它在設計期非常引人注目。然而你一旦開始嘗試做這些設計,你會遭遇一些問題:

template

<

class

t>

class

widget;}

;// ok

template

<

>

void widget<

char

>

::func()

template

<

classt,

class

u>

class

gadget;}

;// error: 因為這裡member function的explicit specialization並無偏特化機制

template

<

class

u>

void gadget<

char

, u>

::func()

從上面我們可以看出:模板和多重繼承是互補的。多重繼承欠缺技術,模板有豐富的技術。多重繼承缺乏型別資訊,而模板中大量存在型別資訊。模板的特化無法擴張,多重繼承容易擴張。你只能為模板成員函式寫乙份預設版本,但是你可以寫數量無需的基類

因此,如果我們將模板和多重繼承組合起來,將會產生非常具有彈性的裝置,應該很適合用於產生程式庫的」設計元素「

c 多重繼承與模板類繼承

在很多大型系統中,c 多重繼承很多 一般是純虛函式實現介面類,多重繼承的類,都是不能定義本身物件的虛函式類,大多是純虛函式類。純虛函式類沒有成員物件,所有的類函式都是純虛函式。例如 class ia public cobject virtual int send 0 class ib public ...

C 類的多重繼承與虛擬繼承

摘自 http tech.ddvip.com 2006 12 116512057312798.html 在過去的學習中,我們始終接觸的單個類的繼承,但是在現實生活中,一些新事物往往會擁有兩個或者兩個以上事物的屬性,為了解決這個問題,c 引入了多重繼承的概念,c 允許為乙個派生類指定多個基類,這樣的繼...

C 類的多重繼承與虛擬繼承

在過去的學習中,始終接觸的單個類的繼承,但是在現實生活中,一些新事物往往會擁有兩個或者兩個以上事物的屬性,為了解決這個問題,c 引入了多重繼承的概念,c 允許為乙個派生類指定多個基類,這樣的繼承結構被稱做多重繼承。舉個例子,交通工具類可以派生出汽車和船連個子類,但擁有汽車和船共同特性水陸兩用汽車就必...