c++ 的三大特性,封裝,繼承,多型。封裝可以使得**模組化,繼承可以擴充套件已存在的**,而多型的目的則是為了介面重用。本篇部落格主要介紹c++中多型的相關概念及使用方法。
多型性是允許你將父物件設定成為和乙個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說:允許將子類型別的指標賦值給父類型別的指標(乙個介面,多種方法)。c++ 支援兩種多型性:編譯時多型性,執行時多型性。
a、編譯時多型性(靜態多型):通過過載函式實現
b、執行時多型性(動態多型):通過虛函式實現。
那麼多型的作用是什麼呢,封裝可以使得**模組化,繼承可以擴充套件已存在的**,他們的目的都是為了**重用。而多型的目的則是為了介面重用。也就是說,不論傳遞過來的究竟是那個類的物件,函式都能夠通過同乙個介面呼叫到適應各自物件的實現方法。執行時多型:
最常見的用法就是宣告基類的指標,利用該指標指向任意乙個子類物件,呼叫相應的虛函式,可以根據指向的子類的不同而實現不同的方法。如果沒有使用虛函式的話,則利用基類指標呼叫相應的函式的時候,將總被限制在基類函式本身,而無法呼叫到子類中被重寫過的函式。因為沒有多型性,函式呼叫的位址將是一定的,而固定的位址將始終呼叫到同乙個函式,這就無法實現乙個介面,多種方法的目的了。非執行時多型:
通過函式過載實現簡而言之:
有virtual才可能發生動態多型現象
(無virtual)呼叫就按原型別呼叫
隱藏是指派生類的函式遮蔽了與其同名的基類函式,規則如下:
虛函式: 就是允許被其子類重新定義的成員函式,子類重新定義父類虛函式的做法,可實現成員函式的動態覆蓋(override)。
純虛函式: 是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加「=0」
1 virtualvoid
funtion()=
0抽象類: 包含純虛函式的類稱為抽象類。由於抽象類包含了沒有定義的純虛函式,所以不能進行例項化。
純虛函式的作用:
為了方便使用多型特性,我們常常需要在基類中定義虛函式。
在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。
為了解決上述問題,引入了純虛函式的概念,將函式定義為純虛函式(方法:virtual returntype function()= 0;
),則編譯器要求在派生類中必須予以重寫以實現多型性。同時含有純虛函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。
示例**:
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#includeusing
namespace
std;
//基類物件
class base
//無viratul關鍵字,不會發生執行時多型
void
g(float x)
void
h(float x)
};
class derived :
public base
//子類與父類的函式同名,無virtual關鍵字,則為隱藏
void
g(int x)
void
h(float x)
};
intmain
(void)
三大特性之 多型
乙個行為不同的物件產生出不同的形態這就是多型,多型也是實現 復用的方式那麼為什麼呢?為什麼多型也是 復用的產物呢,因為多型的第乙個前提就是繼承,必須建立在繼承的基礎之上,才有多型之談,也就是說這個不同的物件也是有前提的,就是在繼承的條件之下的不同的類物件,簡單來說就是子類和基類 多型的第乙個條件就是...
C 三大特性之多型(詳細)
c 特性詳解 c 分為三大特性 封裝 繼承 多型 封裝 類是物件導向程式設計語言中的乙個概念。類是對某個物件的定義。包含有關物件動作方式的資訊,包括它的名稱 方法 屬性和事件。封裝的類有如下的訪問型別 1 公有 public 成員可以在類外訪問 2 私有 private 成員只能被該類的成員函式訪問...
java三大特性之多型
多型 多型的概述 1 多型 事物的多種狀態,polymorphic 物件的多型性 同乙個物件,可能具有不同的名稱,同乙個物件,有不同的型別的引用指向它。本質 同乙個物體有不同的名稱和描述。型別的多型性 同乙個型別,可能具有不同的子類實現。同乙個型別引用,有不同的物件實現。本質 同乙個名字和描述,可以...