c++中,繼承就是在乙個已存在的類的基礎上建立乙個新的類。已存在的類稱為基類,又稱父類;新建立類稱為派生類,又稱為子類。
基類是對派生類的抽象,派生類是對基類的具體化。
(一)派生類的定義與構成
1)派生類的定義
class 派生類名:類派生列表; //基類
class derive:public base{}; //公有派生類
base b,*pb; //定義基類物件,指標
derive d; //定義派生類物件
賦值相容性規則中所指的替代包括如下情況。
(1)派生類的物件可以賦值給基類物件;
b=d; //派生類物件賦值給基類,複製基類繼承部分
(2)派生類的物件可以初始化基類的引用;
base &rb=d; //基類引用到派生類物件
(3)派生類物件的位址可以賦值給指向基類的指標。
pb=&d; //基類指標指向派生類物件
(四)派生類的構造和析構函式
1)建構函式
派生類的建構函式定義形式如下:
派生類名站(形式引數列表):基類名(基類建構函式實參列表),派生類初始化列表
例子:class point //基類建構函式
class rect:public point //派生類建構函式
如果基類有預設建構函式,或者引數全部都是預設引數的建構函式,那麼派生類的建構函式中可以不顯式初始化子物件。編譯器會呼叫基類的建構函式進行初始化。
2)組合關係的派生類的建構函式
包括多個子物件的派生類的建構函式定義為:
派生類名(形式引數列表):基類名(基類建構函式實參列表),
子物件名1(子物件1所屬類的建構函式實參列表)
派生類初始化列表
派生類初始化函式體
下面是一段例項**:
#includeusingnamespace
std;
class
a a(
int a,int
b):a1(a),a2(b){}
//private:
inta1,a2;
};classb//
private:
intb1,b2;
a a1;
};class c:publicb//
private:
intc1,c2;
a a2;
};int
main()
利用gcc編譯器測試:
lzb@lzb:~/classic_lib/c++_learning$ g++ 417.cpp
lzb@lzb:~/classic_lib/c++_learning$ ./a.out 87
6543
21
3)析構函式
在執行派生類的析構函式時候,系統會自動呼叫基類的析構函式與子物件的析構函式,對基類和子物件進行處理。
(五)多重繼承
c++支援乙個派生類同時繼承多個基類。
多重繼承派生類的定義:
class 派生類名:訪問標號1 基類名1,訪問標號2 基類名2,...
class b
void gun()
class c:public a,public b
void hun()
c c,*c1;
c1=&c;
多重繼承時,多個基類可能會出現同名的成員。在派生類中對這種基類物件的直接訪問會有二義性。c++要求派生類對基類成員的訪問必須是無二義性的。這時我們需要使用成員名限定消除二義性:
基類名::成員名 //在派生類內部使用基類成員,可以在fun()前面加上::,得到a::fun()
物件名.基類名::成員名 //派生類物件使用基類成員 ,c.a::fun(); c.b::fun();
物件指標名->基類名::成員名 //派生類指標使用基類成員, c1->a::fun(); c1->b::fun();
b)名字支配規則
在類的派生層次結構中,基類的成員與派生類新增的成員都具有類作用域,二者的作用域是不同的。它們是相互包含的兩個層,基類在外邊,派生類在裡面。配生類如果宣告了乙個和基類成員同名的成員,這時直接使用成員名只能訪問到派生類的成員。如果派生類中宣告了與基類成員函式同名的函式,即使函式形式引數不同,直接使用成員名也只能訪問到派生類的新函式。這時需要作用域運算子和基類名來限定。
c.gun;
c.b::gun(); //使用b::gun
(六)虛基類
如果乙個派生類有多個直接基類,而這些直接基類又有乙個共同的基類,則在最終的派生類中會保留該間接共同基類資料成員的多份同名成員。
在乙個類中保留間接共同基類的多份同名成員,雖然有時候是必要的,可以在不同的資料成員中分別存放不同的資料,也可以通過建構函式分別對他們進行初始化。但是大多數情況下,這種情況是人們不希望出現的。因為保留多份資料成員的副本,不僅占用較多的儲存空間,還增加了訪問這些成員時的困難。
c++提供虛基類機制,使得在繼承間接共同基類時只保留乙份成員。
1)虛基類定義
虛基類是在派生類定義時指定繼承方式時宣告的。因為乙個基類可以在生成乙個派生類時作為虛基類,而在生成另乙個派生類時不作為虛基類。宣告虛基類的一般形式為:
class 派生類名:virtual 訪問許可權標號 虛基類名,...{
成員列表
經過這樣的宣告之後,當基類通過多條派生路徑被乙個派生類繼承時,該派生類只繼承該基類一次,也就是基類成員只保留一次。
注意:為了保證虛基類在派生類中只繼承一次,應當在該基類的所有直接派生類中宣告為虛基類,否則仍然會出現對基類的多次繼承。
2)虛基類的初始化
如果在虛基類中定義了帶引數的建構函式,而且沒有定義
c 類的繼承與派生
一 基本概念 1 類的繼承,是新的類從已有類那裡得到已有的特性。或從已有類產生新類的過程就是類的派生。原有的類稱為基類或父類,產生的新類稱為派生類或子類。2 派生類的宣告 class 派生類名 繼承方式 基類名1,繼承方式 基類名2,繼承方式 基類名n 3 乙個派生類可以同時有多個基類,這種情況稱為...
C 類的繼承與派生
1.乙個包含多級派生 構造 析構函式的綜合例項 include using namespace std class a a 析構函式,關於析構函式只做簡單介紹 void f1 int i protected void f2 int j private int k class b public a 定...
C 類的繼承與派生
繼承是物件導向程式設計中最重要的乙個概念。繼承允許我們根據乙個類來定義另乙個類,達到了 功能重用效果。當建立乙個類時,如果待建立的類與另乙個類存在某些共同特徵,程式設計師不需要全部重新編寫成員變數和成員函式,只需指定繼承另乙個類即可,被繼承的類稱為基類或父類,新建的類稱為派生類或子類。定義乙個派生類...