15.2.5 公有、私有和受保護的繼承
對類所繼承的成員的訪問由基類中的成員訪問級別和派生類派生列表中使用的訪問標號共同控制。
每個類控制它所定義的成員的訪問。派生類可以進一步限制但不能放鬆對所繼承的成員的訪問。
派生類不能訪問基類的private成員,也不能使自己的使用者能夠訪問那些成員。如果基類成員為public或protected,則派生列表中使用的訪問標號決定該成員在派生類中的訪問級別。
如果是公有繼承(public inheritance),基類成員保持自己的訪問級別:基類的public成員為派生類的public成員,基類的protected成員為派生類的protected成員。
如果是受保護繼承(protected inheritance),基類的public和protected成員在派生類中為protected成員。
如果是私有繼承(private inheritance),基類的所有成員在派生類中為private成員。
class base;
class child1:private base
};
無論派生列表中是什麼訪問標號,所有繼承base的類對base中的成員具有相同的訪問。派生訪問標號將控制派生類的使用者對從base繼承而來的成員的訪問。
派生訪問標號還控制來自非直接派生類的訪問。
1. 介面繼承與實現繼承
public派生類繼承基類的介面,它具有與基類相同的介面。設計良好的類層次中,public派生類的物件可以用在任何需要基類物件的地方。
使用private或protected派生的類不繼承基類的介面,相反,這些派生通常被稱為實現繼承。派生類在實現中使用被繼承類但繼承基類的部分並未成為其介面的一部分。
迄今為止,最常見的繼承形式是public。
2.去除個別成員
如果進行private或protected繼承,則基類成員的訪問級別在派生類中比在基類中更受限。
派生類可以恢復繼承成員的訪問級別,但不能使訪問級別比基類中原來指定的更嚴格或更寬鬆。
class base;
class child1:private base
};
正如可以使用using宣告從命名空間使用名字,也可以使用using宣告訪問基類中的名字,除了在作用域操作符左邊用類名字代替命名空間名字之外,使用形式是相同的。
3. 預設繼承保護級別
用struct和class保留字定義的類具有不同的預設訪問級別,同樣預設繼承訪問級別根據使用那個保留字定義派生類也不相同。使用class保留字定義的派生類預設有private繼承,而用struct保留字定義的類預設具有public繼承。
struct保留字定義的類與class定義的類唯一的不同只是預設的成員保護級別和預設的派生保護級別,沒有其他區別。
儘管私有繼承在使用class保留字時時預設情況,但這在實踐中相對罕見。因為私有繼承是如此罕見,通常顯式指定private是比依賴於預設更好的辦法。顯式指定可清除指出想要私有繼承而不是一時疏忽。
第15章 物件導向程式設計
派生類中的虛函式可以返回基類函式所返回型別的派生類的引用或指標。只有指定為虛函式的成員函式才能進行動態繫結。派生類可以進一步限制但不能放鬆對所繼承的成員的訪問。使用private或protected派生的類不繼承基類的介面,稱為實現繼承。使用class保留字定義的派生類預設具有private繼承,而...
第 15章 物件導向程式設計(一)
以quote基類和bulk quote派生類為例,記錄標頭檔案和cpp檔案的構成。目錄 基類和派生類的標頭檔案及cpp檔案結構 quote.h quote.cpp bulk quote.h bulk quote.cpp main.cpp ifndef quote h define quote h i...
第15章 物件導向程式設計 3
15.2.4 virtual與其他成員函式 c 中的函式呼叫預設不使用動態繫結。要出動動態繫結,必須滿足兩個條件 第一,只有指定為虛函式的成員函式才能進行動態繫結,成員函式預設為非虛函式,非虛函式不進行動態繫結 第二,必須通過基類型別的引用或指標進行函式呼叫。1.從派生類到基類的轉換 因為每個派生類...