面試題 虛函式和純虛函式

2021-09-02 06:15:16 字數 2417 閱讀 9656

①虛函式

c++中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有「多種形態」,這是一種泛型技術。

如果呼叫非虛函式,則無論實際物件是什麼型別,都執行基類型別所定義的函式。非虛函式總是在編譯時根據呼叫該函式的物件,引用或指標的型別而確定。如果呼叫虛函式,則直到執行時才能確定呼叫哪個函式,執行的虛函式是引用所繫結或指標所指向的物件所屬型別定義的版本。

虛函式必須是基類的非靜態成員函式。虛函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式,在定義了虛函式後,可以在基類的派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的形參個數和形參型別。以實現統一的介面,不同定義過程。如果在派生類中沒有對虛函式重新定義,則它繼承其基類的虛函式。

class person

這個例子是虛函式的乙個典型應用,通過這個例子,也許你就對虛函式有了一些概念。它虛就虛在所謂「推遲聯編」或者「動態聯編」上,乙個類函式的呼叫並不是在編譯時刻被確定的,而是在執行時刻被確定的。由於編寫**的時候並不能確定被呼叫的是基類的函式還是哪個派生類的函式,所以被成為「虛」函式。

函式只能借助於指標或者引用來達到多型的效果。

②純虛函式

純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加「=0」 virtualvoid getname() =0

在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。為了解決上述問題,將函式定義為純虛函式,則編譯器要求在派生類中必須予以重寫以實現多型性。同時含有純虛函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。

將函式定義為純虛函式能夠說明,該函式為後代型別提供了可以覆蓋的介面,但是這個類中的函式絕不會呼叫。

宣告了純虛函式的類是乙個抽象類。所以,使用者不能建立類的例項,只能建立它的派生類的例項。必須在繼承類中重新宣告函式(不要後面的=0)否則該派生類也不能例項化,而且它們在抽象類中往往沒有定義。

定義純虛函式的目的在於,使派生類僅僅只是繼承函式的介面。

純虛函式的意義,讓所有的類物件(主要是派生類物件)都可以執行純虛函式的動作,但類無法為純虛函式提供乙個合理的預設實現。所以類純虛函式的宣告就是在告訴子類的設計者,「你必須提供乙個純虛函式的實現,但我不知道你會怎樣實現它」。

//抽象類

class person;

class student:public person;

void getname(){

cout<<"studentname:xiaosi"<③

抽象類

抽象類是一種特殊的類,它是為了抽象和設計的目的為建立的,它處於繼承層次結構的較上層。

抽象類的定義: 稱帶有純虛函式的類為抽象類。

抽象類的作用:抽象類的主要作用是將有關的操作作為結果介面組織在乙個繼承層次結構中,由它來為派生類提供乙個公共的根,派生類將具體實現在其基類中作為介面的操作。所以派生類實際上刻畫了一組子類的操作介面的通用語義,這些語義也傳給子類,子類可以具體實現這些語義,也可以再將這些語義傳給自己的子類。

使用抽象類時注意:抽象類只能作為基類來使用,其純虛函式的實現由派生類給出。如果派生類中沒有重新定義純虛函式,而只是繼承基類的純虛函式,則這個派生類仍然還是乙個抽象類。如果派生類中給出了基類純虛函式的實現,則該派生類就不再是抽象類了,它是乙個可以建立物件的具體的類。抽象類是不能定義物件的。④總結

1、純虛函式宣告如下: virtual void fun()=0; 純虛函式一定沒有定義,純虛函式用來規範派生類的行為,即介面。包含純虛函式的類是抽象類,抽象類不能定義例項,但可以宣告指向實現該抽象類的具體類的指標或引用。

2、虛函式宣告如下:virtual void fun();虛函式必須實現,如果不實現,編譯器將報錯。

3、對於虛函式來說,父類和子類都有各自的版本。由多型方式呼叫的時候動態繫結。

4、實現了純虛函式的子類,該純虛函式在子類中就變成了虛函式,子類的子類即孫子類可以覆蓋該虛函式,由多型方式呼叫的時候動態繫結。

5、虛函式是c++中用於實現多型(polymorphism)的機制。核心理念就是通過基類訪問派生類定義的函式。

6、在有動態分配堆上記憶體的時候,析構函式必須是虛函式,但沒有必要是純虛的。

7、友元不是成員函式,只有成員函式才可以是虛擬的,因此友元不能是虛函式。但可以通過讓友元函式呼叫虛擬成員函式來解決友元的虛擬問題。

8、析構函式應當是虛函式,將呼叫相應物件型別的析構函式,因此,如果指標指向的是子類物件,將呼叫子類的析構函式,然後自動呼叫基類的析構函式。

9、有純虛函式的類是抽象類,不能生成物件,只能派生。他派生的類的純虛函式沒有被改寫,那麼,它的派生類還是個抽象類。定義純虛函式就是為了讓基類不可例項化。因為例項化這樣的抽象資料結構本身並沒有意義。

C 面試題 多型,虛函式,純虛函式

多型 是對於不同物件接收相同訊息時產生不同的動作。c 的多型性具體體現在執行和編譯兩個方面 在程式執行時的多型性通過繼承和虛函式來體現 在程式編譯時多型性體現在函式和運算子的過載上 開課吧廣場c 面試 虛函式 在基類中冠以關鍵字 virtual 的成員函式。它提供了一種介面介面。允許在派生類中對基類...

虛函式面試題

classa classb int tmain intargc,tchar argv 情況a 不是虛函式 輸出hello world,程式執行正常 情況b 有虛函式 程式直接crash 原因是 不是虛函式的情況,this指標當成第乙個引數傳入函式 一般是通過ecx暫存器 主要裡面沒有使用這個this...

虛函式和純虛函式

除了繼承外,c 的另乙個優良特性是支援多型,即允許將派生類的物件當作基類的物件使用。如果a是基類,b和c是a的派生類,多態函式test的引數是a的指標。那麼test函式可以引用a b c的物件。示例程式如下 class a void test a a class b public a class c...