多型性 虛函式

2021-07-26 03:07:44 字數 1749 閱讀 3350

虛函式是過載的另一種表現形式,是一種動態的過載方式。虛函式呼叫與函式體之間的聯絡在執行時才建立。

c++中可以用基類的物件指標可以指向它的公有派生物件,當它指向公有派生類物件時,只能訪問派生類中從基類繼承來的成員,而不能訪問派生類中定義的成員。

當指標指向不同的物件時,分別呼叫不同類的成員函式,如果將函式說明為虛函式,就能夠實現這種動態呼叫的功能。

虛函式的定義:允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。虛函式的定義在基類中進行,它是基類中需要定義為虛函式的成員函式的宣告中冠以virtual.在派生類中重新定義時,必須具有相同的函式原型,包括函式型別,函式名,引數個數,引數型別順序。

說明:

(1)若在基類中,只宣告虛函式原型,而在類外定義時不需要再加virtual.

(2)虛函式重新定義時,其函式的原型與基類中的函式原型都必須相同。

(3)當乙個成員函式定義為虛函式後,其派生類中符合重定義虛函式要求的同名函式都自動成為虛函式,故在派生類中重新定義該虛函式是,關鍵字virtual可以寫或者不寫。

(4)如果在派生類中沒有對基類的虛函式的重新定義,則公有派生類直接繼承基類的虛函式。

(5)虛函式必須是所在的成員函式,不能是友元函式,也不能是靜態成員函式,因為虛函式呼叫要依靠特定的物件來決定該啟用那個函式。

(6)雖然使用物件名和點運算也可以呼叫虛函式,但是這種呼叫在編譯時進行,是靜態聯編,沒有利用虛函式的定義。

虛析構函式:先呼叫派生類的析構函式,再呼叫基類的析構函式virtual ~類名();雖然派生類的析構函式與基類的析構函式名字不相同,但是如果將基類的析構函式定義為虛函式,由該基類所派生的所有派生類的析構函式都自動成為虛函式。

虛函式和過載函式的區別:函式過載是,引數或者引數的型別必須有所不同,函式的返回值也可以不同,但是過載乙個虛函式時,在派生類重新定義虛函式時,要求函式名,返回型別,引數個數,引數型別和順序與基類的虛函式的原型完全相同。

純虛函式:在基類中說明的虛函式,它在該基類中沒有定義,但要求在他的派生類中根據需要對它進行定義,或仍舊說明為純虛函式。virtural 函式型別 函式名(參數列)=0;

純虛函式的作用是在基類中為其派生類保留乙個函式的名字,以便派生類根據需要對它進行重新定義。

如果有乙個至少有乙個純虛函式,那麼就稱這個類為抽象類

(1)抽象類中至少包含乙個沒有定義功能的純虛函式,因此抽象類只能作為其他類的基類,不能建立抽象類的物件。

(2)抽象類不能用作引數型別,函式返回型別或顯式轉換型別,可以宣告指向抽象類的指標變數指標可以指向他的派生類,進而實現多型性

(3)如果在抽象類的派生類中沒有重新說明純虛函式,則函式在派生類中仍然為純虛函式,而這個派生類仍舊是乙個抽象類

多型性 虛函式

先來講講賦值相容規則。前面說過,派生類如果是從基類公有繼承的,則它會包含基類中除建構函式和析構函式外的所有成員,基類的公有成員也成為派生類的公有成員,又因為物件只能訪問類的公有成員,所以基類物件具有的功能,派生類物件都有。這樣就引出了賦值相容規則。賦值相容規則就是指在基類物件可以使用的地方都可以用公...

多型性和虛函式

11.27 多型指的是同樣的資訊被不同型別的物件接收導致不同的行為,包括 靜態多型性和動態多型性。靜態多型性包括 函式過載和運算子過載 動態多型主要 由虛函式實現。虛函式宣告 virsual 型別說明符 函式名 參數列 純虛函式 virtual 函式型別 函式名 參數列 0 在派生類中定義 抽象類 ...

虛函式與多型性

實驗內容 定義基類base,其資料成員為高h,定義成員函式disp 為虛函式,由基類派生出長方體類和圓柱類,並在兩個派生類中定義成員函式disp 為虛函式。在主函式中,用基類base定義指標p,用指標p動態呼叫虛函式disp 顯示面積。虛函式 它是基類中的成員函式,並在派生類中被過載。派生類中的虛函...