(五) c 當中的繼承

2021-08-29 09:58:06 字數 2036 閱讀 2895

一、什麼是繼承

子類(派生類)會繼承基類(父類)的除了建構函式和析構函式的所有方法和資料。這也是c++物件導向的乙個重要特點,只有擁有繼承和多型的語言才能叫做物件導向的語言。

二、繼承許可權

以公有繼承,子類繼承父類的所有方法和資料並且不修改這些方法和資料的訪問許可權。以保護繼承,子類把父類的所有公有屬性的方法和資料修改為保護。以私有繼承,子類把父類的所有公有屬性和保護屬性的方法和資料改為私有。

三、各種許可權區別

私有許可權:當前物件只有通過公有方法和保護方法可以訪問,即子類繼承了父類的私有資料或者方法,只有父類的公有方法或者保護方法可以訪問,而子類任何許可權的方法都不能直接訪問。這裡有一點,你的方法如果是私有的,那麼通過物件是無法調動該方法的,所以不做討論。

保護許可權:當前物件只有通過公有方法和保護方法可以訪問,即子類繼承了父類的保護資料或者方法,只有父類的公有方法或者保護方法可以訪問,而子類任何許可權的方法都不能直接訪問。看起來保護許可權和私有許可權是一樣的,但是在考慮到多代繼承時,兩者會顯現不同的屬性。例如:乙個子類b繼承父類a以私有繼承。現在有乙個孫子類c要繼承b,那麼無論c以什麼方式繼承b的屬性,c都不可能直接訪問a的方法和資料。     如果b類以保護繼承a,無論c以什麼方式繼承b,c都可以訪問a的公有和保護的資料和方法。   舉個例子:就比如說你以私有方式繼承你父親的雙眼皮,那麼別人可以通過你得到你父親是雙眼皮的結論,而你的兒子就只會繼承你的基因而不會繼承你父親的基因,別人就不能通過你兒子而推導出你父親是雙眼皮,因為你兒子並沒有真正的繼承到你父親的基因。         但是如果說你是保護的方式繼承父親的雙眼皮,那麼你兒子在你這裡就會找得到你父親的基因來繼承,這樣就可以通過你兒子推導出你父親是雙眼皮。

公有許可權:就不說了

// 這是會報錯的**,私有繼承

#include using namespace std;

class base

~base(){}

public:

// 公有方法

void showbase(void)

~base(){}

public:

// 公有方法

void showbase(void)

{ cout<<"showbase:"針對於多繼承,子類會先構造父類物件,當父類的建構函式為預設建構函式時,即沒有引數時,子類可以直接構造父類物件,但自定義建構函式之後,使父類建構函式有了引數,那麼你必須顯示的構造父類物件。**體現為以下操作。

#include using namespace std;

class base1

{public:

// 非預設建構函式,有引數無預設值,子類必須顯示構造base1類的物件

base1(int data):base1data(0)

{ base1data = data;

cout<<"base1date預設建構函式"<五、虛基類的繼承問題

在實際當中可能會遇到以下情況,子類繼承的多個父類繼承了同乙個爺爺類,那麼這樣的話要訪問爺爺類的公有資料或者方法就必須加上作用限定符 :: 但是這這種繼承方法會為每乙個父類構造乙個爺爺類,記憶體上得不到有效的利用,資料上的操作也很繁瑣。就根據實際也是不現實的,假如父類繼承乙份遺產,不可能乙份遺產變兩份或者說多份交由子類繼承,那豈不是繼承的越多那麼的得到的遺產也越多,可實際遺產只有乙份。就由一種想法說有沒有可能將這種情況處理成static類成員資料的方式,讓所有的子類只構造乙個爺爺類。

// 觀察現象可以發現base1被構造了兩次

#include using namespace std;

class base1

{public:

base1():data(0)

{ cout<<"base1被構造"class base1

{public:

base1():data(0)

{ cout<<"base1被構造"<最後再說一句:繼承的順序優先虛繼承,其次才是宣告順序

C 當中 和 的使用

c 是我們許多人在步入程式設計的時候的第乙個入門語言。但是,這個語言當中也有好多難以理解的概念。在這裡簡單介紹一下兩種位址符號。在介紹這兩個符號之前,我們先說明一下c 當中的兩個概念,變數和位址。變數裡存在兩個值,乙個是變數在記憶體中存著的位置,也就是位址,另外乙個就是這個變數的值,存在記憶體當中。...

C 當中 foreach 的原理

在 c 當中的foreach語句實際上就是遍歷迭代器的語法糖。例如我們擁有以下 public class testclass foreach var int in integers 上述 結構十分簡單,作用就是遍歷integers陣列,並將其結果輸出到控制台當中。由於int是乙個array型別,它繼...

C 當中的 號的作用

第一種情況作為stringizing operator 叫字串化。define stringer x printf x 第二種情況作為char operator 叫做字元化 define charger x x 第三種情況作為token pasting operator 叫做連線符 define t...