繼承與派生是同一過程從不同的角度看
保持已有類的特性而構造新類的過程稱為繼承
在已有類的基礎上新增自己的特性而產生新類的過程稱為派生。
被繼承的已有類稱為基類(或父類)
派生出的新類稱為派生類(或子類)
直接參與派生出某類的基類稱為直接基類
基類的基類甚至更高層的基類稱為間接基類
繼承的目的:實現設計與**的重用。
派生的目的:當新的問題出現,原有程式無法解決(或不能完全解決)時,需要對原有程式進行改造。
語法class 派生類名:繼承方式 基類名
成員宣告;
例class derived: public base
public:
derived ();
~derived ();
語法class 派生類名:繼承方式1 基類名1,繼承方式2 基類名2,…
成員宣告;
注意:每乙個「繼承方式」,只用於限制對緊隨其後之基類的繼承。
例class derived: public base1, private base2
public:
derived ();
~derived ();
public, private, protect
公有派生類物件可以被當作基類的物件使用,反之則不可。
派生類的物件可以隱含轉換為基類物件;
派生類的物件可以初始化基類的引用;
派生類的指標可以隱含轉換為基類的指標。
通過基類物件名、指標只能使用從基類繼承的成員。
有示例**;預設情況下:
基類的建構函式不被繼承;
派生類需要定義自己的建構函式;
c++11規定
可用using語句繼承基類建構函式
但是只能初始化從基類繼承的成員;
語法形式: using b::b;
若不繼承基類的建構函式
派生類新增成員:派生類定義建構函式初始化;
繼承來的成員:自動呼叫基類建構函式進行初始化;
派生類的建構函式需要給基類的建構函式傳遞引數。
單繼承派生類名::派生類名(基類所需的形參,本類成員所需的形參):
基類名(參數列), 本類成員初始化列表
;單繼承時的建構函式舉例
#include
using
namespace std;
classb;
b::b()
b::b
(int i)
b::~b(
)void b::
print()
const
classc:
public b
;c::c(
)c::c(
int i,
int j):b
(i),
c(j)
c::~c(
)void c::
print()
const
intmain()
多繼承且有物件成員時派生的建構函式定義語法
派生類名::派生類名(形參表):
基類名1(引數), 基類名2(引數), …, 基類名n(引數),
本類成員(含物件成員)初始化列表
//其他初始化
建構函式的執行順序
呼叫基類建構函式。
順序按照它們被繼承時宣告的順序(從左向右)。
對初始化列表中的成員進行初始化。
順序按照它們在類中定義的順序。
物件成員初始化時自動呼叫其所屬類的建構函式。由初始化列表提供引數。
執行派生類的建構函式體中的內容。
一般都要為基類的複製建構函式傳遞引數。
複製建構函式只能接受乙個引數,既用來初始化派生類定義的成員,也將被傳遞給基類的複製建構函式。
基類的複製建構函式形參型別是基類物件的引用,實參可以是派生類物件的引用
例如: c::c(const c &c1): b(c1)
析構函式不被繼承,派生類如果需要,要自行宣告析構函式。
宣告方法與無繼承關係時類的析構函式相同。
不需要顯式地呼叫基類的析構函式,系統會自動隱式呼叫。
先執行派生類析構函式的函式體,再呼叫基類的析構函式。
當派生類與基類中有相同成員時:
若未特別限定, 則通過派生類物件使用的是派生類中的同名成員;
如果要通過派生類物件訪問基類中被隱藏的同名成員,
應使用基類名和作用域操作符(::)來限定;
二義性問題
如果從不同基類繼承了同名成員, 但是在派生類中沒有
定義同名成員, 「派生類物件名或引用名.成員名」,
"派生類指標->成員名"訪問成員存在二義性問題;
解決方式一:用類名限定;
解決方式二:同名隱藏;
是不是用類名限定就可以解決重名問題?有這麼簡單嗎?
比如繼承的有同名成員的基類又繼承自乙個最遠基類,就很麻煩;
問題與解決
問題:
當派生類從多個基類派生, 而這些基類又有共同基類,
則在訪問此共同基類中的成員時, 將產生冗餘,並有可能
因冗餘帶來不一致性;
虛基類宣告:
class b1:virtual public b
作用:
主要用來解決多繼承時可能發生的對同一基類繼承多次
而產生的二義性問題;
為最遠的派生類提供唯一的基類成員, 而不重複產生多次複製;
注意:
在第一級繼承時就要將共同基類設計為虛基類;
虛基類不是萬能的, 一些情況須慎用;
虛基類帶來的問題: 其派生類建構函式
建立物件時所指定的類稱為最遠派生類
虛基類的成員是由最遠派生類的建構函式通過呼叫虛基類的建構函式進行初始化的
在整個繼承結構中, 直接或間接繼承虛基類的所有派生類,
都必須在建構函式的成員初始化表中為虛基類的建構函式列出引數;
如果未列出, 則表示呼叫該虛基類的預設建構函式;
在建立物件時, 只有最遠派生類的構造函式呼叫虛基類的建構函式,
其他類對虛基類建構函式的呼叫被忽略;
繼承與派生的基本概念
單繼承與多繼承
類成員的訪問控制
派生類物件的構造和析構
派生類與基類物件的型別轉換
類成員的標識與訪問
虛繼承
第七章筆記
程序就是cpu未完成的工作 檢視程序的相關命令 ps a 關於當前環境的所有程序 x 與當前環境無關的所有程序 f 顯示程序從屬關係 e 顯示當前使用者環境中的所有程序 l 長列表顯示程序的詳細資訊 u 顯示程序的使用者資訊 ps ax o cpu,mem,user,group,comm,nice,...
Java Head First 第七章 繼承與多型
1.繼承 1 找出具有共同屬性和行為的物件 2 設計出代表共同狀態與行為的類 3 決定子類是否需要讓某項行為 也就是方法的實現 有特定不同的運作方式 4 通過尋找使用共同行為的子類來找出更多抽象化的機會 2.繼承 是乙個 的意思 a b繼承a,可以說b就是a,b擁有a所有的方法 b 3.在子類中打算...
程式設計思想第七章
過載 相同的返回值,相同的函式名稱,不同的引數列表。override註解是jdk1.5之後的產物,可以防止你在不想過載時而意外的進行過載 因為父類沒有這個過載方法,所以不能用這個註解 7.1復用 的三種方式 1,直接new關鍵字建立該類物件,組合 優點 快速方便 缺點 生成和銷毀物件,給效能帶來額外...