C中虛函式,虛基類,virtual的用法我很暈,高手能幫

2022-02-16 08:48:45 字數 4852 閱讀 6835

1樓:

c++中有繼承的概念,即乙個基類總領一組的類!而虛函式就是把這一組的類共同的特徵和行為抽出來,放在基類裡面,好比宣告,而具體到每個派生類時,再把這個特徵和行為(函式)描述出來。好處就是利用向上轉型這個特點,使用基類的物件來呼叫這一組類的物件的函式。

比如定義乙個基類動物,派生貓,狗等等,我就可以在動物類中定義虛函式,例如捕食,而具體到貓是抓老鼠,狗吃骨頭。。。

#include

using namespace std;

class a

而虛基類是應對多繼承的問題,c++的複雜繼承產生了乙個問題,比如a派生b和c,而b和c同時派生到d,而例項化d的物件時,就會先呼叫基類的建構函式,這樣就會呼叫2次,虛基類就是解決這個問題,讓b和c虛繼承於a,就解決了這個問題!

class a

;class b:virtual public a;class c:virtual publica;class d:

public b,public c;virtual具體的用法還是看看書吧,我也叫不准了。。

2樓:紫月居士

虛函式是用於繼承的一種技巧,我們可以在父類中定義乙個函式,這個函式本身可以完全不被執行,它的存在是為了給不同的子類提供函式的一種樣式。即,在子類中過載函式。

或者,如果父類本身是乙個虛類,那麼其中的函式必然是虛函式。因為其根本不可能被執行。

至於virtual的用法,就是在虛函式的宣告前加上virtual 。如果需要宣告的是純虛函式,則在函式後追加=0(純虛函式不能擁有函式體。)

c++請問如果使用了虛繼承,基類就不必用virtual來宣告虛函式了?

3樓:踏岸尋柳

虛函式/虛繼承是不一樣的概念。

虛函式是為了實現多型,而虛繼承是為了避免重複繼承。

4樓:匿名使用者

樓上正解,樓主要先把虛函式和虛繼承的概念搞清楚了

你可以參閱"c builder5程式設計例項與技巧"前面概念介紹有節詳細說明過

c++裡的虛函式 是不是沒什麼用處?

5樓:匿名使用者

用處很大

多型就需要用虛函式

介面通常指類提供給外部呼叫它的函式,可狹義理解為乙個class的public method

推薦看一下thinking in c++,三言兩語是說不清楚的

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

6樓:莫斯利安純牛奶

c++中虛函式的作用:

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

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

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

c++中虛函式的用法:

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

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

擴充套件資料:

使用虛函式的注意事項:

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

2、虛析構函式

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

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

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

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

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

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

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

7樓:木子青耶

虛函式的作用:

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

虛函式的使用方法是:

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

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

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

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

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

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

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

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

8樓:匿名使用者

c++中虛函式的作用:

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

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

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

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

c++中虛函式的用法:

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

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

9樓:匿名使用者

c++中虛函式的作用:

1、方便使用多型特性。

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

為了解決上述問題,引入了純虛函式的概念,將函式定義為純虛函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以重寫以實現多型性。同時含有純虛函式的類稱為抽象類,它不能生成物件。

這樣就很好地解決了上述兩個問題。

宣告了純虛函式的類是乙個抽象類。所以,使用者不能建立類的例項,只能建立它的派生類的例項。

純虛函式最顯著的特徵是:它們必須在繼承類中重新宣告函式(不要後面的=0,否則該派生類也不能例項化),而且它們在抽象類中往往沒有定義。

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

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

虛函式的使用方法是:

1、在基類用virtual宣告成員函式為虛函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。在類外定義虛函式時,不必再加virtual。

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

c++規定,當乙個成員函式被宣告為虛函式後,其派生類中的同名函式都自動成為虛函式。因此在派生類重新宣告該虛函式時,可以加virtual,也可以不加,但習慣上一般在每一層宣告該函式時都加virtual,使程式更加清晰。如果在派生類中沒有對基類的虛函式重新定義,則派生類簡單地繼承其直接基類的虛函式。

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

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

如果指標不斷地指向同一類族中不同類的物件,就能不斷地呼叫這些物件中的同名函式。這就如同前面說的,不斷地告訴計程車司機要去的目的地,然後司機把你送到你要去的地方。

c++關於虛函式和虛繼承的問題,請高手指教一下,謝謝了。

10樓:匿名使用者

第乙個:

定義了虛函式,那麼繼承他的所有類都有這個需函式.虛函式可以覆寫,於是該類的所有子類的f()都可以覆寫.

第二個:

派生類時為什麼要繼承基類又繼承基類的子類.沒有意義

11樓:匿名使用者

我不知道是不是對的,也剛考2級,還不知道過沒

1。定義的是虛基類,為的是防止成員的二義性,fun()不是虛函式。

2。f()都為虛函式,應該不必用虛繼承

12樓:

虛函式和虛繼承沒什麼關係,各管各的.

虛函式實現多型,

虛繼承防止重複繼承同乙個函式.

13樓:匿名使用者

class base;

class a:public base;

class b:public base;

c 中虛函式和純虛函式的作用與區別

包含純虛函式的類不可以例項化。c 中 虛函式與純虛函式的區別是什麼?虛函式與純虛函式 在他們的子類中都可以被重寫。它們的區別是 1 純虛函式只有定義,沒有實現 而虛函式既有定義,也有實現的 純虛函式一般沒有 實現部分,如 virtual void print 0 而一般虛函式必須要有 的實現部分,否...

c中虛函式與純虛函式的區別是什麼

虛函式與純虛函式 在他們的子類中都可以被重寫。它們的區別是 1 純虛函式只有定義,沒有實現 而虛函式既有定義,也有實現的 純虛函式一般沒有 實現部分,如 virtual void print 0 而一般虛函式必須要有 的實現部分,否則會出現函式未定義的錯誤。virtual void print 2 ...

包含純虛函式的基類是否不能用作定義物件

沒問題,不能定義物件但可以定義物件的指標和物件的引用。含有純虛函式的類是不可以用來建立物件的,因為它是虛基類 這得分清楚含有純虛函式的類與虛基類是兩個不同的概念。1 含有純虛函式的類是不能建立物件 2 虛基類是指在繼承的時候,通過虛繼承的方式,繼承的基類。含有純虛函式的類在繼承的時候,可以不加vir...