c++多型的含義
1、什麼是多型?
(1)通過繼承同乙個基類,產生了相關的不同的派生類,與基類中同名的成員函式在不同的派生類中會有不同的實現,也就是說:乙個介面、多種方法。
(2)多型是物件導向的重要技術之一,它是一種行為的封裝,是同乙個事物所表現出來的多種形態,簡單地說就是:乙個介面、多種形態。
(3)那麼問題來了,現在,在執行時使用同乙個成員名來呼叫類物件的成員函式,會呼叫哪個物件的成員函式呢?這就是多型要解決的問題!
2、多型的作用?
(1)多型技術允許將基類指標或基類引用指向派生類物件。
(2)把不同派生類的物件都當作基類物件來看待,可以遮蔽不同派生類之間的差異,從而寫出通用的**以適應需求的不斷變化。
3、多型的分類?
(1)多型分為兩種:
4、在c++中如何實現多型?
(1)在c++中,基類指標是用來指向基類物件的,如果用它來指向派生類物件,則進行指標型別轉換(上行轉換),將派生類指標轉換為基類指標,所以該指標將會指向派生類物件中的基類部分,通過該指標是無法呼叫派生類物件中的成員函式的。
但是,虛函式突破了這一限制。在派生類的基類部分中,派生類的虛函式取代了基類原來的同名虛函式,因此在使基類指標指向派生類物件後,使用該基類指標呼叫這個同名虛函式成員時就呼叫了派生類的虛函式。
(2)當把基類的某個成員函式宣告為虛函式時,c++允許在其派生類中對該虛函式進行重新定義,賦予它新的功能,並且可以通過基類指標指向同一類族的不同派生類的物件,來呼叫相應派生類中的該同名虛函式。
由虛函式實現的動態多型性就是:同一類族中不同的派生類物件,對同一函式呼叫作出不同的響應。
(3)虛函式的使用方法如下:
(4)c++規定,當乙個成員函式被定義為虛函式後,其派生類中的同名函式都自動成為虛函式(而不一定要有關鍵字virtual顯示宣告了),但是為了清晰,習慣上每一層都加上virtual關鍵字。
舉例如下:
[cpp]view plain
copy
class
base
void
my()
; class
child1:
public
base
void
my()
; class
child2:
public
base
void
my() ;
base *bptr;
child1 c1(10,1);
child2 c2(10,2);
bptr=&c1;//語句1:基類指標指向派生類物件child1
bptr->func();//語句2:呼叫的是child1中的func()
c1.func();//
bptr->my();//
c1.my();//
bptr=&c2;//語句3:基類指標指向派生類物件child2
bptr->func();//語句4:呼叫的是child2中的func()
c2.func();//
bptr->my();//
c2.my();//
5、虛函式與純虛函式的區別與聯絡?
(1)應該考慮:對成員函式的呼叫是通過物件名還是通過基類指標或是基類引用去訪問。如果是後兩者,則應當宣告為虛函式。
(2)虛函式:如果乙個類中定義了虛函式virtual,那麼這個虛函式是被實現的,其作用就是為了讓該虛函式在這個類的的派生類中被覆蓋,被實現為不同的功能,從而結合基類指標以實現動態多型性。
(3)純虛函式:有時,在定義乙個虛函式時,並不定義其函式體,即它的函式體是空的,它的作用只是保留乙個虛函式名,它關注的是介面的統一性,其具體的功能實現由它的派生類完成。比如:virtual float area(float a,float b ) = 0;
(4)抽象類與抽象基類:不用來定義物件而只作為一種基本型別用作被繼承的類,稱為抽象類;由於它經常用來作基類,故又被稱之為抽象基類。凡是包含純虛函式的類,都是抽象類,這種類不能直接生成物件(例項),它的作用就是作為乙個類族的共同基類,或者說是為乙個類族提供乙個公共介面。
(5)需要說明的是,使用虛函式,系統要有一定的空間開銷。當乙個類中含有虛函式時,編譯系統會為它構造乙個虛函式指標vptr(4位元組),同時這個虛函式指標指向乙個虛函式表vtable,虛函式表是乙個指標陣列,存放的是該類中的每個虛函式的入口位址。(查表是高效的,因此多型性是高效的。)
6、虛析構函式的作用?
(1)當派生類的物件從記憶體中撤銷時,一般先呼叫派生類的析構函式釋放該物件中的派生類部分,再呼叫基類的析構函式釋放該物件中的基類部分,從而能夠完整的釋放該物件記憶體。
(2)但是,當用基類指標指向了乙個派生類物件,即 base *bptr = new child;此時用delete bptr;來撤銷bptr 指向的動態儲存空間時,只會執行基類的析構函式來釋放該堆記憶體中的基類部分,但是並不會執行派生類的析構函式來釋放該堆記憶體中的派生類部分。此時,就會造成記憶體洩漏現象。
(3)為了避免此類現象發生,我們將基類的析構函式宣告為虛析構函式,這樣就解決了上述問題(即先呼叫派生類的析構函式釋放該動態空間中的派生類部分,再呼叫基類的析構函式釋放該動態空間中的基類部分,從而能夠完整的釋放該堆記憶體)。
(4)如果將基類的析構函式宣告為虛析構函式,那麼該基類的所有派生類的析構函式都自動成為虛析構函式。
7、類的成員函式的過載、覆蓋(重寫)、隱藏(重定義)的區別與聯絡?
答:分別簡單講述一下函式過載、函式覆蓋、函式隱藏的概念與特徵:
函式過載:過載函式通常用來命名一組功能相似的函式。
(1)兩個函式要在相同的類域
(2)兩個函式的名稱相同
(3)兩個函式的的形參列表必須不同
函式覆蓋:覆蓋是指派生類函式覆蓋基類函式。
(1)兩個函式要在不同的類域
(2)兩個函式的名稱相同
(3)基類函式必須是虛函式
(4)兩個函式的形參列表和返回值型別要相同
函式隱藏:指派生類的函式遮蔽了與其同名的基類函式。
(1)兩個函式在不同的類域
(2)兩個函式的名稱相同
(3)兩個函式的形參列表不同
(4)如果派生類函式與基類函式形參列表相同,但是在基類函式中沒有virtual關鍵字,也會發生函式隱藏
C 中 和 的含義
的基本含義 乘法運算子 雙目運算子 出現在表示式中。指標宣告符 定義時 如int p 總是緊隨型別宣告符出現,是宣告的一部分。的基本含義 按位與 雙目運算子 出現在表示式中。引用 定義時 這是c 在c功能上的擴充套件,是為了防止總是使用指標。引用指的是乙個變數的別名,定義 b a,那麼b從今以後就是...
C 多型 繼承多型
什麼是多型?個人理解為 在程式語言繼承關係中,子類能替代父類,表現出不同的行為。換句話說 在繼承關係中,乙個類被例項化被其子類替代,子類中有父類的虛方法重寫,或者有父類同名方法 new 呼叫相同方法時候,將表現出子類或者父類中不同行為 老闆,上 static void main string arg...
C 什麼是多型,多型的用途
qq群 807236138 群稱 ios 技術交流學習群 1 定義 乙個介面,多種方法 程式在執行時才決定呼叫的函式。2.實現 c 多型性主要是通過虛函式實現的,虛函式允許子類重寫override 注意和overload的區別,overload是過載,是允許同名函式的表現,這些函式引數列表 型別不同...