C 虛函式,多型性,純虛函式,抽象類

2021-06-23 03:33:09 字數 2089 閱讀 9236

一:虛函式

1.用virtual關鍵字宣告的函式叫虛函式

虛函式標明在基類宣告的虛函式是虛擬的,並不是實際存在的函式,在派生類中才會正式定義此函式

虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式

eg:class a};       class b:public a};

a a;

b b;

a *ptr;

ptr=&a;

ptr->display();//呼叫的是類a中的display

ptr=&b;

ptr->display();//呼叫的還是類a中的display

當然這不是我們想要的,我們想要的是定義乙個指向a類的指標,可以呼叫本身的函式還可以呼叫其眾多派生類的函式

(不能呼叫派生類函式是因為,基類指標指向的是基類物件,如果將他指向派生類物件,則自動進行指標型別轉換,將派生類的物件的指標先轉換為基類的指標,所以基類指標指向的派生類中基類的部分,自然就不能呼叫派生類中的函式了。)

只要將a類中的display()改為虛函式就可以做到了(在類中新增virtual,在類外定義函式(給函式增加實體)的時候就不用加了)

派生類中不需要加virtual,因為當乙個派生類重寫基類中的虛函式時,派生類中的此函式自動變為了虛函式,但是為了**的清晰,一般在派生類也都會加上virtual

這就是:上面紅字中:通過基類指標或引用來訪問基類和派生類中的同名函式的意義

(其實用虛函式的時候,指標發生型別變換之類的都是一樣的,並且這時候基類指標指向的同樣是派生類中基類的部分,只不過派生類中重寫虛函式的時候,實際上是把派生類中繼承基類的這個函式覆蓋掉了,就是說派生類中繼承來的這個函式替換成了自己重寫的這個函式了,其實這就叫覆蓋。

因為你繼承類的時候,派生類拷貝了基類所有的非private的內容,又新增了自己的內容,並不是跟基類共用那部分內容,是拷貝)

當然可通過直接用b.display的方式呼叫,但是如果a類有很多的派生類,這樣就非常的麻煩了

這就是c++的多型:利用同乙個語句ptr->display();呼叫了不同的函式,並且ptr只是基類的指標,看基類的指標是指向的基類還是派生類來決定呼叫哪個函式

二:多型

1.在編譯時如果發現虛函式,就會採用遲繫結技術,編譯時並不確定具體呼叫的函式,而是執行時依據物件的型別來呼叫的那乙個函式,這種能力叫做多型性

簡單說:在基類前加virtual關鍵字,在派生類中重寫此函式,執行時根據物件的實際型別(這個物件的實際型別是通過

基類指標

的指向來確定的)來呼叫相應的函式

靜態多型性:像函式的過載,用同一函式名但是會呼叫不同的函式,此時的多型是編譯前就知道了需要用到哪個函式

動態多型性:類似1中講到的虛函式作用的例子,實際上就是動態多型性:同一類族(基類跟他眾多的繼承類)中不同類的物件,對同一函式呼叫作出的不同響應

2.為什麼一直強調的是基類指標 

因為正是因為基類指標才實現的多型,如果不用虛函式的情況下,重寫基類中的函式,用基類指標呼叫的是基類的函式,但是用派生類的指標呼叫的就是派生類重寫的函式了,這樣相當於是用了兩個指標完成的不同呼叫,這不叫多型,多型就是因為都是基類指標,只是指向不同從而實現的呼叫不同。  

三:純虛函式

成因:有些時候虛函式其實對基類來說是無用的,也就是說基類中並不需要這個函式,只是為了派生類需要而為其留個函式名,因為不留的話無法實現多型了這個時候就可以用純           虛函式

使用:在類中宣告的時候 virtual 函式型別  函式名  (引數)  =0  ;(=0並不是說返回值為0,只是告訴編譯器這是個純虛函式)

特點:純虛函式沒有函式體,只有函式的名字不具備函式的功能,所以不能呼叫;只是宣告乙個虛函式供派生類使用的,只有在派生類中提供了此函式的定義(派生類中實現覆蓋,並新增函式體)後才可以被呼叫。 

注:如果乙個類中宣告了純虛函式,而在派生類中沒有對該函式定義,則該虛函式在派生類中仍然為純虛函式,此派生類依然為抽象類。

四:抽象類

定義:含有純虛函式的類就叫抽象類

特點:抽象類不能建立物件,或者說不能被例項化,但是可以定義指向抽象類資料的指標變數,當派生類完全實現了所有的純虛函式後,就可以用這種指標指向派生類的物件,然後通過該指標呼叫虛函式,實現多型性         

多型性(純虛函式與抽象類)

將乙個虛函式初始化為0之後,該函式就變成了純虛函式。如 viurtual double area 0 這個虛函式是無任何的功能,不能直接來呼叫,因為它是抽象的,只有被子類繼承並賦予功能後才可呼叫。乙個類可以有多個純虛函式,但是只要有乙個純虛函式給類就是抽象類。抽象類只是乙個概念,就如同人類一樣,沒有...

多型性 虛函式 抽象類

一 多型性 指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的實現動作。c 支援兩種多型性 編譯時多型性,執行時多型性。1.編譯時多型性 通過過載函式實現 2.執行時多型性 通過虛函式實現。二 虛函式 虛函式是在基類中被宣告為virtual,並在派生類中重新定義的成員函式。可實現成員函式的動態...

多型,虛函式,純虛函式,抽象類

c 中,實現多型有以下方法 虛函式,抽象類,過載,覆蓋 多型性在object pascal和c 中都是通過虛函式 virtual function 實現的。這麼一大堆名詞,實際上就圍繞一件事展開,就是多型,其他三個名詞都是為實現c 的多型機制而提出的一些規則,下面分兩部分介紹,第一部分介紹 多型 第...