c (八) 繼承與多型(二)

2021-10-06 13:47:07 字數 2065 閱讀 1703

一、抽象類與動態型別轉換

1、訪問控制屬性

類的定義中有public、private和protected三個關鍵字,其中private關鍵字說明類中成員為私有成員,只能在類內的函式訪問;public成員為公有成員,可被任何其他類訪問,protected關鍵字是保護屬性,保護屬性的資料或函式可被派生類成員訪問。

class a

;class b : public a//公有繼承

};int main()

繼承分為公有繼承、私有繼承和保護繼承;

//基類

class a

{};//公有繼承

class b : public a

{};//私有繼承

class c : private a

{};//保護繼承

class d : protected a

{};

三種繼承的區別:

//公有繼承                      物件訪問    成員訪問

public    -->  public              y         y

protected -->  protected           n         y

private   -->  private             n         n

//保護繼承                      物件訪問    成員訪問

public    -->  protected           n         y

protected -->  protected           n         y

private   -->  protected           n         n

//私有繼承                      物件訪問    成員訪問

public    -->  private             n         y

protected -->  private             n         y

private   -->  private             n         n

2、抽象類與純虛函式

當類太抽象以至於無法例項化就叫做抽象類。抽象類不能例項化(建立物件)。

當基類中的函式要求子類實現它時,此函式叫做抽象函式或純虛函式。

//基類

class bike

;class mountainbike : public bike

};

包含純虛函式(抽象函式)的類叫做抽象類。上述例子中bike類為抽象類,不能例項化物件。

3、動態型別轉換

動態型別轉換使用:dynamic_cast運算子。

作用:a、沿繼承層級向上、向下及側向轉換到類的指標和引用。

轉指標失敗時返回nullptr,轉引用失敗則丟擲異常。

//基類

class bike

;class mountainbike : public bike

};class racingbike : public bike

};void print(bike &bike)

}

4、上轉和下轉

將派生型別指標賦值給基類型別指標為上轉;反之為下轉。

上轉可不使用dynamic_cast而隱式轉換;

下轉必須顯式執行。

上面的方法簡稱為:父上,子下;上轉隱,下轉顯。

之所以有上述規則,是因為可將派生類物件截斷,只使用繼承來的資訊,但不能將基類物件加長,無中生有變出派生類物件。

5、typeid(執行時查詢型別的資訊)

運算子typeid返回乙個type_info物件的引用,typeid(type).name()返回實現定義。

#include #include a a{};

auto& t = typeid(a);

if(typeid(a) == t)

C 繼承與多型(二)

多型 虛函式 類成員函式前面加virtual關鍵字 虛函式重寫 當在子類的定義了乙個與父類完全相同的虛函式時,則稱子類的這個函式重寫了這個父類的這個虛函式 滿足條件 1.虛函式的重寫 2.父類的指標 引用呼叫虛函式 多型跟型別無關,與物件有關 多型 當使用基類的指標或引用調重寫的虛函式時,當指向父類...

八 繼承多型

繼承的格式 public class 子類名extends 父類名 繼承的好處 a 提高了 的復用性 b 提高了 的維護性 c 讓類與類之間產生了關係,是多型的前提 繼承的弊端 讓類與類之間產生了關係,也就讓類的耦合性增強了。開發原則 高內聚,低耦合。內聚 就是自己完成某件事情的能力 耦合 類與類的...

C 繼承與多型

派生類繼承基類 又稱父類 超類 的屬性和方法,在此基礎上可以進行修改或新增新的屬性和方法。class 派生類名 繼承方式 基類名 為了保護基類的資料封裝性,無論哪種繼承方式,積累的私有成員在派生類中都是不可見的。1.public繼承 基類的訪問許可權在派生類中不變。公有還是公有,保護還是保護,派生類...