C Plus Plus 基礎篇(二)

2021-06-06 01:25:18 字數 3046 閱讀 8078

(一)繼承

繼承中派生類與基類的許可權關係:

1.當基類以public方式被繼承,那麼基類的所有公有成員都會成為派生類的公有成員,基類protected屬性的成員也會變成派生類的protected屬性成員。

2.當基類以protected方式被繼承,那麼基類的public,protected屬性的成員都會變成派生類的protected屬性的成員。

3.當基類以private方式被繼承,那麼基類所有public,protected屬性的成員都會變成派生類的private屬性的成員。

4.從上面三條獲取可以看出,不管採取哪種繼承方式,基類private屬性的變數永遠沒有被繼承,所以派生類永遠不能繼承基類的private屬性成員。

class animal

;//public繼承

class person:public animal

;//protected繼承

class person:protected animal

;//私有繼承

class person:private animal

;

(二)函式覆蓋,函式隱藏,函式過載

在派生類繼承基類的時候,如果派生類中擁有和基類同名的函式就會涉及到函式覆蓋和函式隱藏的問題。下面我們就將覆蓋,隱藏,過載三者區分一下以免。以後寫程式的時候犯這些錯誤,debug半天後,拍著桌子叫道「我這個程式沒錯兒呀,是不是編譯器的問題呀!!!」囧~~

函式過載特徵:

(1)作用在同乙個類中

(2)函式名相同,引數不同

(3)virtual關鍵字可有可無

class animal

~animal(){}

void eat()

~animal(){}

virtual void eat()

~animal(){}

virtual void eat()

~animal(){}

void eat()

};class b:public a

};class c:public a

};class d:public b,public c

;class c:public virtual d{};

class a:public b,public c{}

4.虛基類的建構函式:正如上面所說,如果不加作為虛基類繼承,那麼將會產生兩個副本,現在我們作為虛基類繼承了,產生乙個副本的原理是什麼呢?當按照虛基類繼承後,如果定義乙個a的物件,那麼就直接呼叫d的建構函式和a的建構函式,在這兒就不經過b,c的建構函式了,因此就會只有1個副本了。

.(五)虛函式與多型

1)繼承中的指標問題

1.當基類指標指向派生類物件時候,基類指標只能訪問派生類從基類派生過來的變數。

2.基類指標可以指向派生類物件,派生類指標不能指向基類物件。

2)虛函式

1.為什麼要使用虛函式:從上面我們就發現基類指標指向派生類物件不能訪問派生類中的變數或函式,為了解決這個問題,我們引入了虛函式。

2.不能把成員變數宣告為虛有的,virtual關鍵字不能用在成員變數前面。

3.一般以指標呼叫虛函式,不用運算子呼叫

4.如果宣告乙個基類指標,讓它指向不同的派生類,這些派生類都從基類繼承而來,如果從基類繼承過來f虛函式,各自派生類又對此虛函式進行了重寫,那麼基類指標指向各自派生類呼叫f函式的時候,是呼叫的派生類重寫的虛函式,這也就是上面標號1裡面所說問題的解決方法。

5.虛函式必須在基類中使用virtual關鍵字,派生類中重寫虛函式加或者不加virtual關鍵字都行。

6.包括虛函式的類被稱為多型類,c++使用虛函式支援多型性。

7.在派生類中重定義虛函式的時候函式名和函式引數要一致,否則那就是過載了。

8.一旦函式為虛函式,那麼不管多少重繼承,它都是虛函式(好命苦~~)

9.隱藏虛函式:當我們重定義虛函式的時候我們不小心將它過載了,那麼我們就只能把基類的虛函式覆蓋了(隱藏,覆蓋知識在上面講解過)

10.帶預設形參的虛函式:當基類的虛函式帶有預設形參時,派生類對虛函式進行重定義後,用基類指標指向派生類物件呼叫虛函式時是呼叫的基類虛函式,而不是派生類衝定義的虛函式。(因為這邊是預設形參,基類的預設形參會)

11.從上面一點你也許會為派生類打抱不平,好不容易重定義一下,你還不讓我用,那麼好吧,給你點自由,如果是派生類自己的物件,則可以呼叫自己重定義的。

12.析構函式可以為虛函式,但是建構函式不行

13.純虛函式宣告形式:virtual 型別 函式名(引數列表)=0;

14.如果類有純虛函式,那麼這個類就是抽象類。

15.抽象類不能有物件,只能作為其他類的基類。(因為抽象類中有乙個或多個函式沒定義)

16.雖然抽象類不能有物件,但是可以宣告乙個指標指向派生類物件。

17.虛函式虛擬特徵是以層次結構方式來繼承的。比如c繼承了b,並從定義b中的虛函式,d繼承c沒有重定義虛函式,現在乙個d的物件呼叫虛函式不是呼叫b中的,而是呼叫c中的。

啊呼,這貌似是我看黃邦勇帥寫的東西裡面最長的規則了,下面貼上一段**,結合**和執行結果好好理解上面這些規則吧~~

class a

執行結果:

3)虛析構函式

上面就有一條規則說,析構函式可以加virtual,但是建構函式不行,我們為什麼要宣告為虛析構函式呢?舉個例子,如果我們現在用基類指標指向派生類物件,然後delete基類指標,在不宣告為虛基類的情況下,只會呼叫基類的析構函式而不會呼叫派生類,為了解決此問題,我們宣告為虛析構函式,這樣我們在呼叫基類的析構函式的時候也會呼叫派生類的析構函式。

class animal

執行結果:

寫到最後發現這篇文章裡面也沒有擴充套件多少原創作者的多少知識,基本上都是自己在按照他寫的學習,自己又按照自己的理解寫了一遍兒,所以這篇文章就作為自己的一篇讀書筆記吧,

原稿作者是黃邦勇帥。

(TypeScript篇)二 基礎

概念 定義了一切事物的抽象特點 物件 類的例項 物件導向三大特性 封裝繼承多型 1 構建動物類 class animal is running 例項化 const snake new animal snake console.log snake.run 物件點方法 console.log 靜態屬性 ...

C 基礎篇總結 二

c 開始講的一些很基礎,講了隨機數的產生 三大結構以及列舉變數等等。現在回想一下,剛開始是弄懂了,還有一些知識記得不太清了,及時的進行梳理一下。引數的呼叫和輸出 continue 和break區別 陣列是比較重要的一種應用,陣列的宣告有以下幾種形式 intnums2 new int intnums1...

jQuery基礎篇(二)DOM

我們可以通過以下語句來建立乙個新的標籤。動態建立元素後還需要將節點放入到文字中。a.prepend b 將b新增到a中,並設定為第乙個a的子元素 a.prependto b 將a新增到b中,並設定為第乙個b的子元素 另一組節點插入方法 after before insertafter insertb...