繼承和物件導向設計是c++的高階特性,需要長期的積累才能領悟。這裡只是根據effective c++條目進行的梳理,順序有所調整,根據自身不成熟的認知來進行的過濾,已備後用。
公有(public)繼承注意事項
1.「public繼承」意味著is-a的關係。
適用於base classes身上的每一件事情也一定適用於derived classes身上,因為每乙個derived classes物件也是乙個base classes物件。
2.derived classes內的名稱會遮掩base classes內的名稱。
在public繼承下從來沒有人希望如此。
3.為了讓被遮掩的名稱再現,可以使用using宣告式或轉交函式。
如下:class base;
class derived : public base;
使用轉交函式
class derived : public base
---------
};4.不要重新定義繼承而來的non-virtual函式。
因為non-virtual函式是靜態繫結的,同時也指定了derived必須同時繼承它的介面和實現,所以如果繼承了non-virtual函式而需要修改它,那麼我們是不是要考慮這個設計是否合理?如果非要修改,請把該函式宣告為virtual。
5.不要重新定義乙個繼承而來的預設引數值。
因為預設引數值都是靜態繫結的,而virtual函式,我們唯一應該覆寫的東西卻是動態繫結的。如果需要請找替代方案。
復合和私有繼承
1.復合(composition)的意義和public繼承完全不同。
復合是has-a的關係,而public繼承則是is-a的關係。
2.在應用領域,復合意味 has-a,而在實現領域,復合意味著is-implemented-terms-of(根據某物實現出來)。
3.private繼承意味著is-implemented-terms-of。
它通常比復合的級別低。但是當derived class需要訪問protected base class的成員時,或需要重新定義繼承而來的virtual函式時,這個設計是合理的。
4.private繼承可以造成empty base的最優化,這點和復合是不同的。
這對於致力於「物件尺寸最小化」的程式庫開發者而言,可能很重要。
介面繼承和是實現繼承
1.介面繼承和實現繼承是不同的。
在public繼承體系下,derived class總是繼承base class的介面。
2.純虛函式(pure virtual functions)只具體指定介面繼承。
如下:
class shape;
3.一般虛函式(impure virtual functions)具體指定介面繼承以及預設實現繼承。
如下:
class shape;
3.non-virtual函式具體指定介面繼承以及強制性實現繼承。
如下:
class shape;
虛函式(virtual functions)以外的替代方案
1.虛函式的替代方案包括nvi(non-virtual inte***ce)手法以及strategy設計模式的多種形式。
nvi手法自身是乙個特殊形式的template method設計模式。
2.將機能從成員函式移到class外部函式。
如此將會帶來缺點,非成員函式無法訪問class的non-public成員。
3.tr1::function物件的行為就像一般的函式指標。
這樣的物件可接納「與給定的目標標籤名式相容」的所有可以呼叫物。
關於多重繼承
1.多重繼承比單一的繼承複雜。
它可能導致新的歧義性,以及對virtual繼承的需要。
2.virtual繼承會增加大小,速度,初始化(及賦值)複雜度等等成本。
如果virtual base classes不帶任何資料,將是最具實用價值的情況。
3.多重繼承的確有正當用途。
其中乙個情節涉及「public繼承某個inte***ce class」和「private繼承某個協助實現的class」的兩相組合。這個在大型系統架構中還是比較多的,我看到過好多了。
條目主線:effective c++ third edition
Objective C繼承和物件導向的原則
但這些都不是最大的問題。最大的問題在於,xib物件違反了物件導向的原則,你無法繼承乙個xib物件。我們用純 編寫的物件,通過類的繼承關係,可以很方便地重用 而使用ib的話,你無法做到這一點。你很辛苦地在ib裡設計了乙個view controller,而且為它編寫了許多 你想在子類中擴充套件它,那麼你...
物件導向c 之繼承
物件導向三大機制包括 1.封裝,隱藏內部實現。2.繼承,復用現有 物件導向最顯著的特徵 3.多型,改寫物件行為。繼承,是一種復用的手段。是從先輩處得到屬性和行為特徵。類的繼承就是新的類從已 有 的類那裡得到已有的特徵。類成員的訪問限定有三種 public,protected,private,在類外可...
c 物件導向之繼承
1 什麼是繼承?繼承簡單來理解就是子承父業,也即是孩子可以直接使用父親的東西,這樣自己就可以少奮鬥一些,父親有的東西可以直接拿過來用。2 程式設計中為什麼要用繼承?在程式設計中,對程式猿來說最想做的就是用盡可能少且高效的 實現想要的功能。就像好多人都不願白手起家一樣,直接繼承父母的財產,使用繼承可以...