虛擬函式的定義,C 中虛擬函式必須有定義嗎?

時間 2021-08-30 10:08:18

1樓:赫連巧山

1. 虛擬函式的定義

虛擬函式用來表現基類和派生類的成員函式之間的一種關係.

虛擬函式的定義在基類中進行,在需要定義為虛擬函式的成員函式的宣告前冠以關鍵字 virtual.

基類中的某個成員函式被宣告為虛擬函式後,此虛擬函式就可以在一個或多個派生類中被重新定義.

在派生類中重新定義時,其函式原型,包括返回型別,函式名,引數個數,引數型別及引數的先後順序,都必須與基類中的原型完全相同.

虛擬函式是過載的一種表現形式,是一種動態的過載方式.

2. 為什麼使用虛擬函式

#include

class cbase;

class cderive1 : public cbase;

class cderive2 : public cbase

執行結果:

this is the base class!

this is the base class!

this is the base class!

this is the derive1 class!

this is the derive2 class!

通過物件指標進行的普通成員函式呼叫,僅僅與指標的型別有關,而與此刻正指向什麼物件無關.要想實現當指標指向不同物件時執行不同的操作,就必須將基類相應中的成員函式定義為虛擬函式.

3. 虛擬函式與過載函式的關係

一般的過載函式,函式的返回型別及所帶的引數必須至少有一樣不完全相同,只需函式名相同即可.

基類中定義的虛擬函式在派生類中重新定義時,其函式原型,包括返回型別,函式名,引數個數,引數型別及引數的先後順序,都必須與基類中的原型完全相同.

過載虛擬函式時,若與基類中的函式原型出現不同,系統將根據不同情況分別處理:

(1)僅僅返回型別不同,其餘相同,系統會當作出錯處理;

(2)函式原型不同,僅僅函式名相同,系統會認為是一般的函式過載,將丟失虛特性.

3.3.4 虛基類

#include

class x;

class x1 : public x

二義性錯誤

非虛基類的類層次

虛基類的類層次

當在多條繼承路徑上有一個公共的基類,在這些路徑中的某幾條匯合處,這個公共的基類就會產生多個例項(或多個副本),若只想儲存這個基類的一個例項,可以將這個公共基類說明為虛基類.

class x1 : virtual public x

; class x2 : virtual public x

; 虛基類的初始化

虛基類的初始化與一般多繼承的初始化在語法上是一樣的,但建構函式的呼叫次序不同.

派生類建構函式的呼叫次序有三個原則:

(1) 虛基類的建構函式在非虛基類之前呼叫;

(2) 若同一層次中包含多個虛基類,這些虛基類的建構函式按它們說明的次序呼叫;

(3) 若虛基類由非虛基類派生而來,則仍先呼叫基類建構函式,再呼叫派生類的建構函式.

純虛擬函式

僅僅用來為要從基類中派生的函式佔據一個位置。

純虛擬函式在基類中沒有定義,它們被初始化為0。

任何用純虛擬函式派生的類,都要自己提供該函式的具體實現。

定義純虛擬函式

virtual void mymethod(void) = 0;

2樓:宇望

虛擬函式必須是基類的非靜態成員函式,其訪問許可權可以是protected或public,在基類的類定義中定義虛擬函式的一般形式:

virtual 函式返回值型別 虛擬函式名(形參表)虛擬函式的例項

#include

class cshape

void virtual display( void)本程式執行結果:

cshape

cellipse

c********

crectangle

實現動態聯編需要三個條件:

1、 必須把動態聯編的行為定義為類的虛擬函式。

2、 類之間存在子型別關係,一般表現為一個類從另一個類公有派生而來。

3、 必須先使用基類指標指向子型別的物件,然後直接或者間接使用基類指標呼叫虛擬函式。

3樓:匿名使用者

1、虛擬函式的概念

虛擬函式是以virtual關鍵字宣告的基類函式。如果在基類中將某個函式指定為virtual,並且派生類中有另外一個該函式的定義,則編譯器將知道我們不想靜態連線該函式。我們真正需要的是基於呼叫該函式的物件種類,在程式的特定位置選擇呼叫哪一個函式。

2、定義

語法:virtual 函式返回型別 函式名(參數列)虛擬函式必須是基類的非靜態成員函式,其訪問許可權可以是private或protected或public,在基類的類定義中定義虛擬函式的一般形式:

class基類名;

c++中虛擬函式必須有定義嗎?

4樓:呵呵

需要例項化類的虛擬函式必須有定義,而僅僅定義帶有虛擬函式的類且虛擬函式沒有實現,該類編譯是可以通過的!

純虛擬函式出現在介面類中,並賦值為0,不要為該函式分配函式地址,從而阻止類的例項化!純虛擬函式是沒有定義的,如果實現了也不是純虛擬函式啦!

一般的成員函式可以只有宣告,前提是在應用中不能呼叫該函式,否則會因找不到定義產生連線錯誤!

c++中虛擬函式如何定義,使用時應該注意什麼?

5樓:千鋒教育

/*--

定義純虛擬函式介面:virtual void f()=0; //只是提供介面,實現留給繼承類

使用時應注意:子類必須要實現該函式

--*/

#include

using namespace std;

class a

;class b:public a

};void main()

6樓:

虛擬函式的定義要這樣,virtual 返回型別+函式名(引數);

虛擬函式呼叫時要注意,在類繼承的時候,子類呼叫的虛擬函式和父類中虛擬函式的區別

7樓:匿名使用者

虛擬函式在宣告時與一般函式的不同地方就是需要新增一個標誌符virtual,在定義時和普通函式相同。在呼叫時和一般函式的呼叫也是相同的,只不過要注意多型而已。

虛擬函式的定義是什麼?

8樓:匿名使用者

1、虛擬函式的概念

虛擬函式是以virtual關鍵字宣告的基類函式。如果在基類中將某個函式指定為virtual,並且派生類中有另外一個該函式的定義,則編譯器將知道我們不想靜態連線該函式。我們真正需要的是基於呼叫該函式的物件種類,在程式的特定位置選擇呼叫哪一個函式。

2、定義

語法:virtual 函式返回型別 函式名(參數列)虛擬函式必須是基類的非靜態成員函式,其訪問許可權可以是private或protected或public,在基類的類定義中定義虛擬函式的一般形式:

class基類名;

c++中虛擬函式的定義及用法?

9樓:匿名使用者

z *obj=new z()就代表呼叫無參建構函式,不加括號也沒問題如果真如你描述的一樣,是

z *obj=new z();obj->fun();

的話,那麼書一定是有問題的,因為obj毫無疑問是派生類指標

10樓:匿名使用者

z *obj=new z();

obj->fun();

z後面的圓括號可以省略的,表示呼叫預設建構函式建立一個z型別的物件。obj->fun()不是通過基類指標來呼叫虛擬函式,因為單從你的問題描述來講,z是最終的派生類。

c++中虛擬函式的作用是什麼?它應該怎麼用呢?

11樓:莫斯利安純牛奶

c++中虛擬函式的作用:

1、簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛擬函式。

2、實現多型性,多型性是將介面與實現進行分離。

3、當基類指標指向一個子類物件,通過這個指標呼叫子類和基類同名成員函式的時候,基類宣告為虛擬函式就會調子類的這個函式,不宣告就會呼叫基類的。

c++中虛擬函式的用法:

1、比如你有個遊戲,遊戲裡有個虛基類叫「怪物」,有純虛擬函式 「攻擊」。

2、派生出了三個子類「狼」「蜘蛛」「蟒蛇」,都實現了自己不同的「攻擊」函式,比如狼是咬人,蜘蛛是吐絲,蟒蛇把你纏起來。

擴充套件資料:

使用虛擬函式的注意事項:

1、包含虛擬函式的類指標列表會增大。

2、虛解構函式

(1)解構函式的作用是在物件撤銷之前做必要的「清理現場」的工作。

(2)當派生類的物件從記憶體中撤銷的時候,會先先呼叫派生類的解構函式然後再呼叫基類的解構函式。

(3)當我們new一個臨時物件時,若基類中包含解構函式,並且定義了一個指向該基類的指標變數。

3、建構函式不能宣告為虛擬函式

建構函式不能宣告為虛擬函式。如果宣告為虛擬函式,編譯器會自動報出。

4、不在析構或者構造過程中呼叫虛擬函式

在解構函式或者是建構函式中,我們絕對不能呼叫虛擬函式。即使,我們在建構函式或者解構函式中呼叫虛擬函式,也不會下降至派生類中呼叫函式。

12樓:木子青耶

虛擬函式的作用:

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

虛擬函式的使用方法是:

1.在基類用virtual宣告成員函式為虛擬函式可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。

在類外定義虛擬函式時,不必再加virtual。

2.在派生類中重新定義此函式,要求函式名、函式型別、函式引數個數和型別全部與基類的虛擬函式相同,並根據派生類的需要重新定義函式體。

在派生類重新宣告該虛擬函式時,可以加virtual,也可以不加,但習慣上一般在每一層宣告該函式時都加virtual,使程式更加清晰。

3.如果在派生類中沒有對基類的虛擬函式重新定義,則派生類簡單地繼承其直接基類的虛擬函式。

4.定義一個指向基類物件的指標變數,並使它指向同一類族中需要呼叫該函式的物件。

通過該指標變數呼叫此虛擬函式,此時呼叫的就是指標變數指向的物件的同名函式;

虛擬函式與指向基類物件的指標變數的配合使用,就能方便地呼叫同一類族中不同類的同名函式,只要先用基類指標指向即可。

13樓:匿名使用者

c++中虛擬函式的作用:

1、為了方便使用多型特性,我們常常需要在基類中定義虛擬函式。

2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。

為了解決上述問題,引入了純虛擬函式的概念,將函式定義為純虛擬函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以重寫以實現多型性。

同時含有純虛擬函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。

c++中虛擬函式的用法:

比如你有個遊戲,遊戲裡有個虛基類叫「怪物」,有純虛擬函式 「攻擊」。然後派生出了三個子類「狼」「蜘蛛」「蟒蛇」,都實現了自己不同的「攻擊」函式,比如狼是咬人,蜘蛛是吐絲,蟒蛇把你纏起來。

然後出現好多怪物的時候就可以定義一個 虛基類指標陣列,把各種怪物的指標給它,然後迭代迴圈的時候直接 monster[i]->attack() 攻擊玩家就行了,大概見下圖:

C 純虛擬函式的C 純虛擬函式,C 中純虛擬函式有什麼作用

我愛你罁 純虛擬函式是在基類中宣告的虛擬函式,它可以在基類中有定義,而且派生類必須定義自己的實現方法。基類不能生成物件,可以使用指標或者引用派生類物件。基類不在基類中實現純虛擬函式的方法是在函式原型後加 0 virtual void funtion1 0 1 為了方便使用多型特性,我們常常需要在基類...

關於c中虛擬函式的問題

然後去遠足 1 題主犯了很低階的錯誤 class1 cd new class1 b cd1 new b console.writeline cd.fuc 1 輸出的是 cd 物件的 fuc 方法,cd 物件是 class1 型別,結果是 1 是完全正確的。2 不 override 的這種寫法叫做 隱...

c 為什麼需要把重新定義的函式定義為虛擬函式

聚發稿網 1不是不能定義,是定義了沒意義。因為建構函式不被繼承,而虛擬函式是要在派生類中重定義的2定義虛解構函式後,由於多型,當使用基類指標指向派生類物件時,會呼叫派生類的虛構函式,然後派生類的解構函式自動呼叫基本解構函式。不是虛的話,直接呼叫基類的解構函式了。如果派生類中有用new分配的記憶體,就...