1、繼承
c++的訪問控制方式有三種:public(公有繼承)、protected(保護繼承)和private(私有繼承)。
c++派生類繼承了基類的所有資料型別和除了建構函式和析構函式的所有成員函式。
基類的public
基類的protected
基類的private
公有繼承
public
protected
不可訪問
保護繼承
protected
protected
不可訪問
私有繼承
private
private
不可訪問
2、重寫、覆蓋和隱藏
成員函式被過載的特徵:
成員函式被覆蓋的特徵:
c++的隱藏機制:
對於在不同作用域宣告的識別符號,可見性的原則是:如果存在兩個或多個具有包含關係的作用域,外層宣告了乙個識別符號,而內層沒有再次宣告該識別符號,則該外層識別符號在內層仍可見;如果內層宣告了該識別符號,則外層識別符號被隱藏,內層作用域只可見內層宣告的識別符號。
對於成員函式,如果派生類中宣告了與基類同名的成員函式,那麼即使引數不同,從基類繼承的所有該同名函式的過載形式都將被隱藏。
多繼承派生類會隱藏所有基類的同名函式的所有過載形式。
外層成員函式仍可訪問,但要通過「類物件.基類名::成員函式」的形式,或者」類指標->基類名::成員函式「的形式。
virtual關鍵字和隱藏機制的關係:
通過virtual關鍵字被繼承的類稱為虛基類。
通過以下兩個例子對比分析virtual關鍵字的作用
// demo7_7.cpp: 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include
using namespace std;
class base0 ;
class base2 : public base0 ;
class derived :public base1, public base2
執行結果:
程式結果分析:4個類(base0、base1、base2、deriverd)各自儲存了從類base0繼承而來的成員資料和成員函式,即共有四個空間被占用,類base1、base2占用了不同的儲存空間。
加上virtual關鍵字,把base0變為虛基類
// demo7_7.cpp: 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include
using namespace std;
class base0 ;
class base2 :virtual public base0 ;
class derived :public base1, public base2
執行結果:
結果分析:
可以看到此時對類base1、base2成員的訪問在同一位址,說明此時base1、base2共同使用同一空間,即對虛基類的繼承,所有的類共同維護同一副本。此時共有三個副本,base0、base1和base2共同維護的乙個副本和deveried的副本。
總結:virtual關鍵字使繼承虛基類的類共同維護同一副本,減少了程式對空間的開支,但是同時也減少了能夠儲存的資料量。
c 多繼承機制
由於兩義性問題的根源在公共基類,因此需要從公共基類著手,將公共基類說明為虛基類,就可以避免二義性。如下 注意 一 father 和mother在繼承時將human說明為虛基類,也就是只為子類son生成乙個speak函式,speak函式是惟一的,避免了二義性。二 派生類指標不能直接指向基類物件。三 派...
Python學習之路 類繼承
如果兩個類具有同名的屬性和方法的時候就可以使用繼承,例如b類繼承a類,那麼在b類中就有類a中的屬性以及方法。被繼承的類叫做父類,繼承的而得類叫做子類。繼承是物件導向程式設計的第二個特性。一般來說,父類是一些公有的屬性和方法,因此類的繼承能夠減少 的冗餘,提公升 的可讀性,提高開發效率。幾乎在所有物件...
C 高階之路 8 C 繼承
c 高階之路 8.c 繼承 基礎 繼承含義 繼承指允許重用現有類去建立新類的過程。原則 乙個類派生出來的子類具有這個類的所有非私有的屬性,即繼承的子類擁有父類所有非私有屬性。特點 c 不支援多重繼承,c 類始終繼承自乙個基類 如果未在宣告中指定乙個基類,則繼承自system.object 注意 派生...