繼承與多型篇

2021-08-06 02:01:15 字數 1556 閱讀 2410

oop語言的三大特性:封裝與隱藏、繼承、多型。

1、繼承

繼承的意義在於**的復用,除了基類的建構函式和析構函式外,派生類會繼承基類的所有成員方法與成員變數,但成員方法不占用記憶體。

所以在計算sizeof時,一定要把基類成員變數的記憶體加上。

2、關於基類成員變數的訪問限定

3、派生類物件的構造方式

先構造基類物件,在構造派生類物件,析構時先析構派生類物件,在析構基類物件。

4、基類和派生類成員方法之間的關係

過載

1、在同乙個作用域中;

2、函式名相同,引數列表不同,可以構成函式過載

3、用const/volatile修飾&或者*時能構成過載。

隱藏:在基類與派生類的繼承關係中,返回值,函式名相同,引數列表相同,基類中的成員方法會被隱藏,所以在呼叫基類的同名函式時必須加基類作用域

覆蓋:在基類與派生類的繼承關係中,基類成員方法返回值,函式名,引數列表都相同,並且是vitural的(派生類不用寫vitural也是vitural函式哦),就能構成覆蓋,重寫基類在派生類中的方法。

5、派生類不支援從上到下的轉換,只支援從下(派生類)到上(基類)的轉換。

派生類物件 = 基類物件 flase

基類物件 = 派生類物件 true

基類指標 = 派生類物件 true

派生類指標 = 基類物件 flase

6、c++的4種型別強轉

const_cast 轉換符是用來移除變數的const或volatile限定符

static_cast 非多型的轉換,用於代替c中通常的轉換操作,被作為顯示型別轉換

reinterpet_cast 將資料從一種型別的轉換為另一種型別

dynamic_cast 將乙個基類物件指標(或引用)cast到繼承類指標

7、虛函式表

編譯器為有虛函式的類產生一張虛函式表,這張虛表被該類的所有物件共享,類的每個虛成員佔據虛函式表中的一行。如果類中有n個虛函式,那麼其虛函式表將有n*4位元組的大小。在有虛函式的類的例項中分配了指向這個表的指標的記憶體,所以,當用父類的指標來操作乙個子類的時候,這張虛函式表就顯得尤為重要了,它就像乙個地圖一樣,指明了實際所應該呼叫的函式。

編譯器應該是保證虛函式表的指標存在於物件例項中最前面的位置(這是為了保證取到虛函式表的有最高的效能——如果有多層繼承或是多重繼承的情況下)。 這意味著可以通過物件例項的位址得到這張虛函式表,然後就可以遍歷其中函式指標,並呼叫相應的函式。

8、什麼情況下會發生動態繫結?

只有通過指標或者引用呼叫虛函式時會發生動態繫結

9、當基類指標指向乙個在堆上的派生類物件時,需要把基類析構函式寫成vitural,否則成了靜態繫結,會呼叫基類的析構函式,導致派生類析構不了。

繼承與多型

繼承 繼承是c 語言支援 重用及多型的重要機制。通過繼承,可以繼承可以在現有類的基礎上派生出新類,新類將共享現有類的成員,並且還可以新增新的成員。c 語言中,重用主要表現為可以使用現成的類 如.net框架類庫中的類 來定義新類,主要方法有組合和繼承兩種 繼承是物件導向程式設計支援 重用的另乙個重要機...

繼承與多型

虛函式只要在基類裡定義,所以繼承類都不用重新定義為虛函式,自動成為虛函式。虛函式必須有實現,普通成員函式在沒有呼叫時可以沒有實現 定義 class animal 只需要在基類定義函式為虛,子類中不需要新增virtual.smile函式在沒有呼叫時可以不實現。當有函式為虛函式時,析構函式應定義為vir...

繼承與多型

繼承需要符合的關係 is a,父類更通用 子類更具體 子類繼承父類的所有屬性和方法 不包括父類構造方法 super可以呼叫父類的方法和構造方法 子類可以重寫父類的方法 使用多型之後,當需要增加新的子類型別時,無需更改總部類,程式的可擴充套件性及可維護性增強 簡單來說,多型是具有表現多種形態的能力的特...