C 學習日記day4(繼承和派生)

2021-10-17 08:42:21 字數 3292 閱讀 2646

通過繼承:

1.可以在已有的類的基礎上新增新的功能;

2.可以在已有的類的基礎上新增新的變數;

3.可以修改類的方法;(不常用)

什麼時候需要用到繼承?

1.建立乙個新的類的時候,這個類與現有的類相似(只是多出若干成員變數或成員函式時候)

2.當你建立多個類的時候,擁有很多相似的成員函式或者成員變數,

可以將這幾個類中通用的部分提取出來作為乙個基類。

(節省**節省**)

繼承許可權:

class car{};

class bmw:《繼承許可權》 car{};

class 派生類名:《繼承許可權》 基類名

封裝許可權預設是private 繼承許可權預設依然是private

public繼承方式:

1)基類中public成員在派生類中為public屬性;

2)基類中protected成員在派生類中為protected屬性;

3)基類中private成員在派生類不能使用;

protected繼承方式:

1)基類中public成員在派生類中為protected屬性;

2)基類中protected成員在派生類中為protected屬性;

3)基類中private成員在派生類不能使用;

private繼承方式:

1)基類中public成員在派生類中為private屬性;

2)基類中protected成員在派生類中為private屬性;

3)基類中private成員在派生類不能使用;

引出protected成員的目的:

使得基類的一些成員能夠被他的派生類所使用,又不被外界訪問(不破壞類的封裝性)。

注意點:

建構函式/析構函式/友元關係/過載的new/delete

初始化成員列表:

1.組合物件(乙個類的物件是另乙個類的成員變數)

2.const成員變數

(1,2用的都是成員變數名)

3.初始化基類中繼承過來的成員變數(用的是類名)

初始化成員列表構造順序:

1.基類

2.組合物件(先宣告先構造)

3.自己

4.析構與構造順序相反

私有繼承-組合物件 相同/不同

相同:都可以表示「有乙個」的關係

不同:私有繼承中派生類可以訪問基類的protected成員;

可以重寫基類的虛函式(甚至當基類是抽象類的時候)

組合物件並不具有這些功能

盡可能使用組合物件 萬不得已再用私有繼承

成員覆蓋:

派生類**現與基類中繼承的成員變數名稱相同的成員,

會覆蓋繼承過來的成員(預設呼叫派生類中同名成員)

如何呼叫被覆蓋成員:

類名::成員變數;

物件名.類名::成員函式

派生類中的static關鍵字;

1.基類定義的靜態成員,將被所有派生類共享

2.根據靜態成員自身的訪問特性和派生類的繼承方式,

在類層次體系中具有不同的訪問性質 (遵守派生類的訪問控制)

3.訪問方式 類名 :: 成員

物件.成員 (任意物件)(共享機制)

共享機制 : 任意物件共享 + 派生類共享

多繼承:

class 派生類名:《繼承許可權》 基類名,《繼承許可權》 基類名…

建構函式:

先構造基類後構造派生類;

基類構造順序根據派生時順序決定的;

(class colu:public rectangle,public circle)

int myadd(int x,int y)

int myadd(int x,int y,int z=10)

多繼承中的名稱衝突:

如果不同基類**現相同的成員變數或者成員函式

那麼在派生類中或外部呼叫時候 會出現二義性.

需要明確一下是呼叫那個類中的成員 用"類名::"處理

namespace中域解析符可以連用 ns2::ns3::…

繼承關係中 域解析符不可以連用 base::derived1::derived2::…

為什麼使用虛繼承:

如果乙個派生類(c)從多個基類(b1 b2)派生出來,

並且這些基類(b1 b2)有乙個共同的基類(b)

則在對該基類(b)某個成員進行訪問時 會出現二義性。

(原因,因為乙個基類被繼承多次的時候,會建立多個副本,出現名稱衝突)

虛繼承(virtual)

當將乙個基類宣告為虛基類的時候,不管他在派生類中被繼承多少次,

該基類中的成員在該派生類中始終都只有乙個副本。

語法:class 派生類名:virtual 《繼承許可權》 基類名
虛基類的初始化順序

/*class base1

class base2

class derived1:public base2,virtual public base1

class derived2:public base2,virtual public base1

class top:public derived1,virtual public derived2

base1① base2② derived1③ derived2④ top⑤

呼叫順序:1 2 4 2 3 5

*/

#include

using

namespace std;

class

base1};

class

base2};

class

derived1

:public base2,

virtual

public base1};

class

derived2

:public base2,

virtual

public base1};

class

top:

public derived1,

virtual

public derived2};

intmain()

Python學習日記day4

turtle庫的使用 知識點1 turtle的繪圖窗體,螢幕左上角的座標為 0,0 turtule.setup width,height,startx,starty 設定窗體大小及位置。基本繪圖中,setup函式並不是必須的。知識點2 turtle空間座標體系。turtle最開始位於正中心。turt...

Day4學習日記執行緒(上)

外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img hdjbpjnb 1606229624152 c users wuvcky desktop image 20201124171107079.png package new public class newthread extends...

linux移植日記 day4

1 teq r if rs rt then trap 2 teqi i if rs imm then trap 3 tge if rs rt then trap 4 tgei i if rs imm then trap 5 tgeiu i if rs imm.asuint then trap 6 t...