C 的虛擬函式有什麼用呢,C 中虛擬函式的作用是什麼?它應該怎麼用呢?

2021-04-19 19:40:30 字數 4765 閱讀 1991

1樓:匿名使用者

主要用在繼承抄與多型上

比如有一個襲汽車類,它有bai一個虛du函式alarm(),就是鳴笛的聲zhi

音。汽車類有很多子

dao類,比如卡車類,小轎車類,他們的鳴笛聲音都一樣,所以只需繼承汽車類,不用在每個類裡重寫這個函式。

現在如果新增一個卡丁車類,它的鳴笛聲音和其他類都不一樣,那就可以在這個類裡重寫alarm函式,實現多型

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

2樓:莫斯利安純牛奶

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

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

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

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

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

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

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

擴充套件資料:

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

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

2、虛解構函式

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

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

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

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

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

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

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

3樓:木子青耶

虛擬函式的作用:

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

虛擬函式的使用方法是:

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

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

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

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

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

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

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

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

4樓:匿名使用者

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

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

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

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

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

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

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

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

5樓:匿名使用者

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

1、方便使用多型特性。

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

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

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

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

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

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

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

虛擬函式的使用方法是:

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

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

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

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

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

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

c++中的虛擬函式有什麼用啊 5

6樓:匿名使用者

虛基類可以讓不同的子類的相同函式名有不同表現,而此函式名繼承自虛基類,

在使用的時候,

可以將子類的物件,

向上轉化為虛基類的物件,

以實現多型。

c++中純虛擬函式有什麼作用?

7樓:何度千尋

通過它可以指明一個虛擬函式只是提供了一個可被子型別改寫的介面。

純虛擬函式是在基類中宣告的虛擬函式,它可以在基類中有定義,而且派生類必須定義自己的實現方法。基類不能生成物件,可以使用指標或者引用派生類物件。基類不在基類中實現純虛擬函式的方法是在函式原型後加「=0」

virtual void funtion1()=0引入原因/純虛擬函式的作用

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

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

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

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

8樓:匿名使用者

1。父類中如果都是純虛擬函式,那麼此父類可以作為介面(inte***ce)。

2。父類中存在純虛擬函式,子類中重寫(override)該函式,可實現多型。

c++中的虛擬函式是什麼?

9樓:李李李

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

c++中的虛擬函式的作用主要是實現了多型的機制。

關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。

這種技術可以讓父類的指標有「多種形態」,這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的**來實現可變的演算法。比如:

模板技術,rtti技術,虛擬函式技術,要麼是試圖做到在編譯時決議,要麼試圖做到執行時決議。

c++裡虛擬函式有什麼作用?

10樓:匿名使用者

含義是讓一個函式具有不同的行為。

舉例來說,人這個類有個函式叫工作!醫生和交版警分別繼承自權人,都具有了工作這個函式,當然醫生的工作內容是治病,交警的工作內容是指揮交通。

現在你需要將交警和醫生同等對待,歸類為人,並分別呼叫其工作函式去執行工作。

如果工作這個函式不是虛擬函式,那你呼叫的就是人的工作函式,無任何意義!相反,如果是虛擬函式,那交警就會去指揮交通,醫生會去治病!

c 中解構函式中可以呼叫虛擬函式麼

c 中 解構函式中不可以呼叫虛擬函式。effective c 中有這樣的描述 同樣的原因也適用於析構過程。一旦派生類解構函式執行,這個物件的派生類資料成員就被視為未定義的值,所以 c 就將它們視為不再存在。c 中派生類在構造時會先呼叫基類的建構函式再呼叫派生類的建構函式,析構時則相反,先呼叫派生類的...

C的抽象類中,抽象方法和純虛擬函式區別

問題1 含有virtual修飾符的方法稱為虛擬方法。不能像你說的那樣定義。問題2 1 虛擬方專法,子屬類可以選擇性重寫此方法,也可以不重寫 而抽象 abstract 方法,子類必須重寫。2 虛擬方法可以有實體,如 public virtual void vt 所以,可以直接呼叫虛擬方法 而抽象方法不...

c虛擬函式如何調父類而非子類

1,如果以一個基礎類指標指向一個衍生類物件 派生類物件 那麼經由該指標只能訪問基礎類定義的函式 靜態聯翩 2,如果以一個衍生類指標指向一個基礎類物件,必須先做強制轉型動作 explicit cast 這種做法很危險,也不符合生活習慣,在程式設計上也會給程式設計師帶來困擾。一般不會這麼去定義 3,如果...