1.繼承
本質:**復用
#includeusing namespace std;
class a
private:
int ma;
}class b: public a
private:
int mb;
}
2.繼承關係class b : public a
繼承類:
繼承方式(public、private、protect)
被繼承類
繼承類稱為父類或基類;被繼承類稱為子類或派生類;基類派生了派生類,派生類繼承基類。
3.派生類的記憶體布局
執行上面的**,結果為a類為4個位元組,b類為8個位元組。將這兩個類的記憶體布局畫出來如下:
4.派生類繼承了基類什麼?
能繼承:成員變數,及類作用域,靜態成員方法(除構造和析構以外的所有成員)
不能繼承:構造,析構,友元關係
5.派生類物件的生成/銷毀方式
前面也提到,派生類將基類中除去建構函式和析構函式的其他方法繼承了過來,那麼對於派生類物件中自己的成員變數和來自基類的成員變數,它們的構造方式是怎樣的呢?
答案是:1.先呼叫基類建構函式,構造基類部分成員變數,再呼叫派生類建構函式構造派生類部分的成員變數。2.基類部分成員的初始化方式在派生類建構函式的初始化列表中指定。3.若基類中還有成員物件,則先呼叫成員物件的建構函式,再呼叫基類建構函式,最後是派生類建構函式。析構順序和構造順序相反。見下:
#include using namespace std;
class test
//預設值"= 0",對基類初始化
void show()
private:
int ma;
};class b : public a
b(int b = 0) :mb(b), a(b){}
private:
int mb;
};
若基類沒有預設值,在派生類中的初始化列表上指明基類的構造方式
b(int b):mb(b),a(b)
6.繼承的方式public: 任意位置
protected: 只允許在本類中 或子類中訪問
private: 只允許在本類中訪問(可以被繼承)
基類中不同訪問限定符下的成員 以不同的繼承方式 繼承 在派生類中的訪問限定(繼承過來的成員許可權不能超過繼承方式和父類原有許可權)
總的來說,父類成員的訪問限定符通過繼承派生到子類中之後,訪問限定符的許可權小於、等於原許可權。其中,父類中的private成員只有父類本身及其友元可以訪問,通過其他方式都不能進行訪問,當然就包括繼承。protected多用於繼承當中,如果對父類成員的要求是——子類可訪問而外部不可訪問,則可以選擇protected繼承方式。private繼承了只是不可見(有乙個,組合);public(是乙個)
7.類和類的關係
8.同名函式
派生類從基類中繼承過來的成員(函式、變數)可能和派生類部分成員(函式、變數)重名。1.前面提到,派生類從基類中繼承了基類作用域,所以同成員名變數可以靠作用域區分開(隱藏)。2.同名成員函式則有三種關係:過載、隱藏和覆蓋。
函式過載有三個條件,一函式名相同,二形參型別、個數、順序不同,三相同作用域。根據第三個條件,可知函式過載只可能發生在乙個類中,見下:
分析:base類和derive類的大小就是他們各自包含的成員變數的總大小,derive類繼承了base類中的成員變數,所以要比base類大4個位元組。在上面提到,這裡的方法呼叫都是依據指標的型別,所以我們可以看到 對基類指標p解引用得到的型別只和指標本身的型別相關。
C 繼承與多型(1)
繼承 繼承是使 可以復用的重要手段,也是物件導向程式設計的核心思想之一。例子 先看這樣一段 includeusing namespace std class a private int ma class b public a 繼承列表 private int mb int main 列印結果 可見,...
C 繼承和多型
在c 的物件導向的大家庭裡,我感覺繼承算是很重要的了,因為有很多的東西都是依賴於繼承和多型的,所以單獨的在第三篇部落格裡做總結和昇華。繼承在面相物件的地方是乙個很是重要的東西,可以說在物件導向的世界裡沒有了繼承就沒有了這麼多的東西,而沒有了多型就沒有了多彩的世界。類的繼承是最為普遍的事情了,可是類又...
C 繼承和多型
剛學習了c 繼承和多型,對virtual override seal override new有點了解,在此寫下這篇文章以供以後參考,若有錯誤或不足,還望各位指出。這裡有3個類,分別是grandfather father son。好,我們現在來分析一下grandfather的遺產怎麼讓father繼...