多型:指相同物件接收到不同訊息或者不同的物件接收到相同的訊息時產生的不同的動作。
前者,相同的物件接收不同的訊息可以看做函式的多型,也就是函式的過載,這種多型是靜態的多型,表面上看函式的名稱一樣,或者由於引數的型別或者個數或者返回值形成的不同的函式過載,在編譯器編譯的時候,儘管函式名稱相同,但是在編譯過後會生成不同的函式,這發生在函式執行之前,稱之為靜態的多型。 如
int max(int a,int b);
int max(int a,int b,int c);
函式名相同,
後者,不同物件接收到相同的訊息指的是類的多型。這種多型發生在執行的時候,稱之為動態的多型。動態的多型是建立在類的封裝和繼承的基礎上的。首先來看乙個例子。
#include #define pi 3.14
using namespace std;
class base;
double base::area()
在這裡,用基類的指標base去指向兩個派生類的物件,最後輸出的結果是:
也就是說輸出的都是基類的area函式中的內容,根本沒有多型性。
c++為了實現多型性,採用了乙個關鍵字,就是virtual,將它加在基類的即將要實現多型的函式前,即可實現多型。順便提一下,在派生類中如果不加virtual 也是可以的,只要基類加了virtual即可,編譯器會為我們加上。但是我們一般會在派生類中也新增virtual,是為了使得程式便於閱讀,而且也便於派生類再派生乙個物件,可以直接看出它含有虛函式。現在將上面的base 類中的area函式前面加上virtual,就像程式中注釋的那樣。則輸出:
這就是類的多型。基類的指標base1指向乙個派生類的物件circle(1),和rectangle(1,2),可以分別呼叫各自派生類對應的函式。這就是c++類的多型性。
使用示例:
#include #define pi 3.14
using namespace std;
class base;
base::~base()
void f()
結果是 a a
b
invoke bbb
invoke aaa
invoke bbb
說明:如果是隱藏的話,用指標呼叫這個函式,根據的是指標自己的型別
如果是覆蓋的話,用指標的呼叫,根據的是指標所指的物件的型別。
一句話:覆蓋是多型的表現形式,而隱藏則破壞多型性。
定義乙個虛函式,不實現它,只將它賦予0.該函式就是純虛函式。擁有純虛函式的類就是抽象類。抽象類是用於子類繼承用的,根本不能用於例項化物件。
class base
如,area()就是純虛函式,base類就是抽象類。 C 多型,虛函式小結
之前學c 的時候,課上的特別快。很多東西當時只是會用,細節以及理解都很不到位。時隔一年是時候重新回顧一下了。不然之後都不好意思說自己學過c 這個僅供自己回顧使用。把自己的費解易錯地方記錄下來。首先就是多型。把一些我認為的理解要點記錄一下 1.什麼是多型?從行為 效果 上看,多型即使相同的執行 或者呼...
關於多型的小結
什麼是多型?多型按照字面的意思就是 多種狀態 的意思。在c 中多型有著更廣泛的含義。下面著重介紹c 語言中關於多型的一些知識點。c 中多型分為靜態多型和動態多型。靜態多型通過函式過載和泛型程式設計實現。動態多型通過虛函式來實現。參照下圖 靜態多型 編譯器在編譯期間完成的,編譯器根據函式實參的型別 可...
繼承與多型小結
1.基類派生出派生類 派生類要繼承基類 作用域也會被繼承 2.基類的布局優先於派生類的布局 3.物件的生成 4.物件的銷毀 1 普通的成員變數 2 靜態的成員變數 3 普通的成員方法 4 靜態的成員方法 5 作用域 派生類繼承了基類除構造以外的所有成員8.派生類的構造析構順序 基類構造優先於派生類構...