多型性是物件導向程式設計的又乙個重要思想,關於多型的詳盡描述,請看本人的收藏這篇博文中,詳盡的**了多型的一些特性。
在此,我僅僅以白話的方式描述為何要引入多型:
子類繼承了基類的方法,但子類可以改變這些這些方法以適應自己的特性,而不是只能照搬基類的方法。現在面臨這樣乙個問題:訪問的便捷性和許可權。
我們可以使用物件名的方式來訪問方法,或者使用類指標,類引用的方式來訪問,這都是完全ok的。關鍵問題在於,假如我們有很多派生子類,比如1000個,當我們要訪問具有類似功能(但又有所差異的)的介面時,難道還要用很多物件名去訪問嗎?顯然不科學,一方面,我們這樣做,使得程式缺乏靈活性,易讀性,還費時費力。
那麼有沒有一種方法使得我們能夠用一種統一的方式來進行這種訪問呢?有的,那就是虛函式。
見一段**:
1 # include "上述這段**中沒有使用虛函式,我們看一下結果:iostream"2
using
namespace
std;
3class
base410
};11
12class child1 :public
base
1319
};20
2122
class child2 :public
base
2324
30};
31int
main()
我們本意是試圖通過指標去訪問子類的方法,但是失敗了,原因是:倘若我們偷懶,想只定義乙個基類指標,就能完成對所有子類同一方法的訪問,但是很明顯,基類指標不具備這樣的訪問許可權,也就是,當我們定義乙個基類指標時,就注定了我們基類指標所指向的物件的指標(這裡應該叫位址)會被轉化為基類的位址,也就是,我們沒有辦法去訪問真正意義上的派生類指標,當然,我們定義乙個派生類指標,也不能夠訪問其他派生類的方法,當然,更不能訪問基類方法。
那麼有沒有一種方法,能夠幫助我們一勞永逸,只定義乙個指標就能訪問其他所有派生類同名方法呢?有的
1 # include "這段**與前面一段**僅僅多了乙個關鍵字,但是結果大不相同:iostream"2
using
namespace
std;
3class
base410
};11
12class child1 :public
base
1319
};20
2122
class child2 :public
base
2324
30};
31int
main()
可見,當我們將類方法宣告為虛方法的時候,大大提高了基類指標的訪問許可權,使得基類指標能夠真正意義上訪問子類方法,因此,使用虛函式的方法實現多型是一種優秀的程式設計理念。
關於虛函式和多型細節資訊請見我開篇**部落格。
實際上,了解虛函式的本質和核心原理有助於我們更好的駕馭虛函式的使用,這篇博文中作者以精闢的手法,描述了虛函式的核心機制:
C 虛函式與多型
1.1 虛函式概念 1.定義 在乙個類的成員函式前面加上virtual關鍵字,則該函式就稱為虛函式。2.如果乙個函式不是類的成員函式,則該函式不能定義為虛函式。即就是類外面不能使用virtual關鍵字 1.2 純虛函式與抽象類 1.純虛函式 在虛函式的後面加上 0 virtual void disp...
c 多型與虛函式
多型按字面的意思就是多種形態。當類之間存在層次結構,並且類之間是通過繼承關聯時,就會用到多型。c 多型意味著呼叫成員函式時,會根據呼叫函式的物件的型別來執行不同的函式。下面的例項中,基類 shape 被派生為兩個類,如下所示 include using namespace std class sha...
C 多型與虛函式
這一篇介紹一下 c 物件導向三大特徵之一的多型 之前面試某大廠的實習生被問到多型,後來又了解到一些設計模式,才體會到多型的強大,在這裡把對多型的一點點淺顯認識總結一下 虛表 class test cout sizeof test endl test p new test p vfunc 將類指標p強...