一. 知識點總結
繼承:1.定義
:在已有類的基礎上建立新類的過程。
乙個 b 類繼承
a類,或稱從類
a 派生類
b類 a 稱為基類(父類),類
b 稱為派生類(子類)
2.類繼承關係的語法形式:
class 派生類名
: 基類名錶
資料成員和成員函式宣告
基類名錶
構成訪問控制
基類名1, 訪問控制 基類名
2 ,… , 訪問控制 基類名
n訪問控制
表示派生類對基類的繼承方式,使用關鍵字:
public 公有繼承
private 私有繼承
protected 保護繼承
注:不論種方式繼承基類,派生類都不能直接使用基類的私有成員
3.派生類生成的三個步驟:
①吸收基類成員(全部吸收(構造、析構除外
),但不一定可見):
在c++的繼承機制中,派生類吸收基類中除建構函式和析構函式之外的全部成員。
②改造基類成員:
通過在派生類中定義同名成員(包括成員函式和資料成員)來遮蔽(隱藏)在派生類中不起作用的部分基類成員。
③新增派生類新成員:
僅僅繼承基類的成員是不夠的,需要在派生類中新增新成員,以保證派生類自身特殊屬性和行為的實現。
4.公有繼承
eg:#include
using namespace std ;
class a
void put_xy()
protected: int x, y ;
class b : public a
;void make_s() ; // 使用基類資料成員x,
yprotected: int s;
class c : public b
int get_v()
void make_v() // 使用基類成員函式
protected: int h, v;
5. 重名成員:派生類定義了與基類同名的成員,在派生類中訪問同名成員時遮蔽(hide)了基類的同名成員
在派生類中使用基類的同名成員,顯式地使用類名限定符:
類名 :: 成員
6.eg:
class base
public :
int a , b ;
class derived : public base
public :
int b , c ;
void f ()
derived d ;
d . a = 1 ;
d . base :: b = 2 ;
d . b = 3 ;
d . c = 4 ;
6. 基類的初始化:在建立派生類物件時用指定引數呼叫基類的建構函式來初始化派生類繼承基類的資料
派生類建構函式宣告
派生類建構函式 ( 變元表
) :
基類 (
變元表
) ,
物件成員
1( 變元表
)… 物件成員n (
變元表 ) ;
建構函式執行順序
:基類 à 物件成員à 派生類
eg:#include
using namespace std ;
class parent_class
int inc1 ()
int inc2 ()
void display ()
class derived_class : private parent_class
7.派生類建構函式和析構函式的使用原則:
①基類的建構函式和析構函式不能被繼承
②如果基類沒有定義建構函式或有無參的建構函式,
派生類也可以不用定義建構函式
③如果基類無無參的建構函式,派生類必須定義建構函式
④如果派生類的基類也是派生類,則每個派生類只負責直接基類的構造
⑤派生類是否定義析構函式與所屬的基類無關
8.在c++中
,派生類建構函式的一般格式
為:派生類::派生類名
(引數總表
):基類名
(參數列
)// 派生類新增成員的初始化語句
注意:這是基類有建構函式且含有引數時使用
9. 派生類析構函式
(1)當派生類中不含物件成員時
●在建立派生類物件時,
建構函式的執行順序是:基類的建構函式→派生類的建構函式;
●在撤消派生類物件時,
析構函式的執行順序是:派生類的析構函式→基類的析構函式。
(2)當派生類中含有物件成員時
●在定義派生類物件時,建構函式的執行順序:基類的建構函式→物件成員的建構函式→派生類的建構函式;
●在撤消派生類物件時,析構函式的執行順序:派生類的析構函式→物件成員的析構函式→基類的析構函式。
eg:class b
public:
b()
void who()
protected: char x;
class first_d : public base
void who()
protected: char y;
注意:乙個虛函式,在派生類層介面相同的過載函式都保持虛特性
虛函式必須是類的成員函式
不能將友元說明為虛函式,但虛函式可以是另乙個類的友元
析構函式可以是虛函式,但建構函式不能是虛函式
四.虛函式的過載特性
在派生類中過載基類的虛函式要求函式名、返回型別、引數個數、引數型別和順序完全相同
如果僅僅返回型別不同,c++認為是錯誤過載
如果函式原型不同,僅函式名相同,丟失虛特性
例:class base
;class shape ; // 抽象類
void move ( point p )
virtual void rotate ( int ) = 0 ; // 純虛函式
virtual void draw ( ) = 0 ; // 純虛函式
…...
shape x ; // error,抽象類不能建立物件
shape *p ; // ok,可以宣告抽象類的指標
shape f ( ) ; // error, 抽象類不能作為函式返回型別
void g ( shape ) ; // error, 抽象類不能作為傳值引數型別
shape & h ( shape &) ; // ok,可以宣告抽象類的引用
二.心得體會
繼承可以在**完成之後,優化**,繼承時我們把幾個類共有的資料成員抽出作為基類而去使用,這樣可以實現**的復用,有效提高**的簡潔性,更能提高我們的效率。
但自己很少使用繼承,一是沒有養成這個意識再就是自己改不好。以後會嘗試先用繼承寫些簡單的**。
虛函式常用於繼承,展現了多型性。純虛函式具體例項可以參考一些登陸系統,登陸系統輸入不同型別的賬號密碼,可以進入不同的介面,管理員介面或者使用者介面,通過乙個公有的登陸,來登陸兩個不同介面。
C 虛函式和多型繼承
指標和引用是很好理解的,變數的引用相當於給變數取了個別名,在函式呼叫時,傳引用是會將引數列表的值改變的。include using namespace std int main 最終輸出的結果都是0x7ffdd9aff7b4,即為記憶體中儲存整型變數m的位址。對於虛函式,它是實現多型公有繼承的關鍵。...
C 多型,虛函式小結
之前學c 的時候,課上的特別快。很多東西當時只是會用,細節以及理解都很不到位。時隔一年是時候重新回顧一下了。不然之後都不好意思說自己學過c 這個僅供自己回顧使用。把自己的費解易錯地方記錄下來。首先就是多型。把一些我認為的理解要點記錄一下 1.什麼是多型?從行為 效果 上看,多型即使相同的執行 或者呼...
C 繼承 多型 虛函式
c 支援多繼承 class parent class parent2 class child public parent,private parent2公有繼承和私有繼承的區別 public parent 公有繼承,private和public都會繼承 private parent 私有繼承,只繼承...