繼承與派生

mf1crystal發表於2018-01-16

類之間的關係:
has-A:
包含關係,用以描述一個類由多個“部件類”構成。實現has-A關係用類成員表示,即一個類中的資料成員是另一種已經定義的類.
use-A
一個類部分地使用另一個類。通過類之間成員函式的相互聯絡,定義友員或物件引數傳遞實現。
is-A
機制稱為“繼承”。關係具有傳遞性,不具有對稱性。

繼承的關係:
繼承是類與類之間的關係,是一個很簡單很直觀的概念,與現實世界中的繼承類似,例如兒子繼承父親的財產。

繼承(Inheritance)可以理解為一個類從另一個類獲取成員變數和成員函式的過程。例如類 B 繼承於類 A,那麼 B 就擁有 A 的成員變數和成員函式。被繼承的類稱為父類或基類,繼承的類稱為子類或派生類。

繼承概念:
繼承:
繼承是使用已經編寫好的類來建立新類,新的類具有原有類的所有屬性和操作,也可以在原有類的基礎上做一些修改,
新類稱為派生類或者子類原有類稱為基類或者父類,
派生類是基類的具體化。
繼承的一些性質:
1、子類擁有父類的所有成員變數和成員函式
2、子類可以擁有父類沒有的方法和屬性
3、子類就是一種特殊的父類
4、子類物件可以當作父類物件使用

單個類的訪問控制:
public 修飾的成員變數 方法 在類的內部 類的外部都能使用
protected: 修飾的成員變數方法,在類的內部使用 ,在繼承的子類中可用 ;其他 類的外部不能被使用
private: 修飾的成員變數方法 只能在類的內部使用 不能在類的外部

繼承許可權:

1) public繼承方式
基類中所有 public 成員在派生類中為 public 屬性;
基類中所有 protected 成員在派生類中為 protected 屬性;
基類中所有 private 成員在派生類中不能使用。

2) protected繼承方式
基類中的所有 public 成員在派生類中為 protected 屬性;
基類中的所有 protected 成員在派生類中為 protected 屬性;
基類中的所有 private 成員在派生類中不能使用。

3) private繼承方式
基類中的所有 public 成員在派生類中均為 private 屬性;
基類中的所有 protected 成員在派生類中均為 private 屬性;
基類中的所有 private 成員在派生類中不能使用。

通過上面的分析可以發現:
1) 基類成員在派生類中的訪問許可權不得高於繼承方式中指定的許可權。例如,當繼承方式為 protected 時,那麼基類成員在派生類中的訪問許可權最高也為 protected,高於 protected 的會降級為 protected,但低於 protected 不會升級。再如,當繼承方式為 public 時,那麼基類成員在派生類中的訪問許可權將保持不變

型別相容性原則
型別相容規則是指在需要基類物件的任何地方,都可以使用公有派生類的物件來替代。通過公有繼承,派生類得到了基類中除建構函式、解構函式之外的所有成員。這樣,公有派生類實際就具備了基類的所有功能,凡是基類能解決的問題,公有派生類都可以解決。型別相容規則中所指的替代包括以下情況:
子類物件可以當作父類物件使用
子類物件可以直接賦值給父類物件
子類物件可以直接初始化父類物件
父類指標可以直接指向子類物件
父類引用可以直接引用子類物件
在替代之後,派生類物件就可以作為基類的物件使用,但是隻能使用從基類繼承的成員。
型別相容規則是多型性的重要基礎之一。

繼承時構造析構呼叫的規則;
1、子類物件在建立時會首先呼叫父類的建構函式
2、父類建構函式執行結束後,執行子類的建構函式
3、當父類的建構函式有引數時,需要在子類的初始化列表中顯示呼叫
4、解構函式呼叫的先後順序與建構函式相反

繼承與組合混搭情況下,構造和析構呼叫原則:
原則: 先構造父類,再構造成員變數、最後構造自己
先析構自己,在析構成員變數、最後析構父類
//先構造的物件,後釋放

繼承中的同名成員變數的處理方法
過載:必須在同一個類中進行
子類無法過載父類的函式,父類同名函式將被名稱覆蓋
過載是在編譯期間根據引數型別和個數決定函式呼叫
重定義:必須發生於父類與子類之間
並且父類與子類中的函式必須有完全相同的原型(如果用virtual關鍵字修飾,那叫重寫)
派生類中的static的關鍵字:
繼承和static關鍵字在一起會產生什麼現象哪?
理論知識
基類定義的靜態成員,將被所有派生類共享
根據靜態成員自身的訪問特性和派生類的繼承方式,在類層次體系中具有不同的訪問性質 (遵守派生類的訪問控制)
派生類中訪問靜態成員,用以下形式顯式說明:
類名 :: 成員

1> static函式也遵守3個訪問原則
2> static易犯錯誤(不但要初始化,更重要的顯示的告訴編譯器分配記憶體)

多繼承:
概念: 一個類有多個直接基類的繼承關係稱為多繼承
多繼承宣告語法
class 派生類名 : 訪問控制 基類名1 , 訪問控制 基類名2 , … , 訪問控制 基類名n
{
資料成員和成員函式宣告
};
類 C 可以根據訪問控制同時繼承類 A 和類 B 的成員,並新增
自己的成員
多繼承的派生類的構造和訪問:
多個基類的派生類建構函式可以用初始式呼叫基類建構函式初始化資料成員
執行順序與單繼承建構函式情況類似。多個直接基類建構函式執行順序取決於定義派生類時指定的各個繼承基類的順序。
一個派生類物件擁有多個直接或間接基類的成員。不同名成員訪問不會出現二義性。如果不同的基類有同名成員,派生類物件訪問時應該加以識別。

虛繼承
如果一個派生類從多個基類派生,而這些基類又有一個共同的基類,則在對該基類中宣告的名字進行訪問時,可能產生二義性
如果在多條繼承路徑上有一個公共的基類,那麼在繼承路徑的某處匯合點,這個公共基類就會在派生類的物件中產生多個基類子物件
要使這個公共基類在派生類中只產生一個子物件,必須對這個基類宣告為虛繼承,使這個基類成為虛基類。
虛繼承宣告使用關鍵字 virtual

相關文章