1樓:
類的三個重要特徵:封裝、繼承、多型性。
其中多型性就是通過函式過載(運算子過載實質上也是函式過載)和虛擬函式來實現的。
虛擬函式的作用:在基類用virtual宣告成員函式為虛擬函式,在派生類中重新定義該函式,就可以通過基類指標或引用來訪問基類和派生類中的同名函式。
虛擬函式實現多型性:同一類族中不同類的物件,對同一函式呼叫做出不同的響應。
多型性其實就是一個介面,多種方法,分為靜態多型性和動態多型性,函式過載屬於靜態多型性,在程式編譯時就可確定呼叫哪個函式,其過程稱為靜態關聯或早期關聯,靜態多型性又稱編譯時多型性;虛擬函式屬於動態多型性,在程式執行過程中才動態地確定所呼叫的是那個物件的函式,其過程稱為動態關聯或滯後關聯,動態多型性又稱執行時多型性。
2樓:巴慕竺美曼
其作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。實現動態多型性,使同一類族中不同類的物件對同一函式呼叫作出不同響應。說白了,就像一個多頻段收音機,一臺機子響應不同事件。
c++中虛擬函式的作用是什麼?它應該怎麼用呢?
3樓:莫斯利安純牛奶
c++中虛擬函式的作用:
1、簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛擬函式。
2、實現多型性,多型性是將介面與實現進行分離。
3、當基類指標指向一個子類物件,通過這個指標呼叫子類和基類同名成員函式的時候,基類宣告為虛擬函式就會調子類的這個函式,不宣告就會呼叫基類的。
c++中虛擬函式的用法:
1、比如你有個遊戲,遊戲裡有個虛基類叫「怪物」,有純虛擬函式 「攻擊」。
2、派生出了三個子類「狼」「蜘蛛」「蟒蛇」,都實現了自己不同的「攻擊」函式,比如狼是咬人,蜘蛛是吐絲,蟒蛇把你纏起來。
擴充套件資料:
使用虛擬函式的注意事項:
1、包含虛擬函式的類指標列表會增大。
2、虛解構函式
(1)解構函式的作用是在物件撤銷之前做必要的「清理現場」的工作。
(2)當派生類的物件從記憶體中撤銷的時候,會先先呼叫派生類的解構函式然後再呼叫基類的解構函式。
(3)當我們new一個臨時物件時,若基類中包含解構函式,並且定義了一個指向該基類的指標變數。
3、建構函式不能宣告為虛擬函式
建構函式不能宣告為虛擬函式。如果宣告為虛擬函式,編譯器會自動報出。
4、不在析構或者構造過程中呼叫虛擬函式
在解構函式或者是建構函式中,我們絕對不能呼叫虛擬函式。即使,我們在建構函式或者解構函式中呼叫虛擬函式,也不會下降至派生類中呼叫函式。
4樓:木子青耶
虛擬函式的作用:
允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。
虛擬函式的使用方法是:
1.在基類用virtual宣告成員函式為虛擬函式可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。
在類外定義虛擬函式時,不必再加virtual。
2.在派生類中重新定義此函式,要求函式名、函式型別、函式引數個數和型別全部與基類的虛擬函式相同,並根據派生類的需要重新定義函式體。
在派生類重新宣告該虛擬函式時,可以加virtual,也可以不加,但習慣上一般在每一層宣告該函式時都加virtual,使程式更加清晰。
3.如果在派生類中沒有對基類的虛擬函式重新定義,則派生類簡單地繼承其直接基類的虛擬函式。
4.定義一個指向基類物件的指標變數,並使它指向同一類族中需要呼叫該函式的物件。
通過該指標變數呼叫此虛擬函式,此時呼叫的就是指標變數指向的物件的同名函式;
虛擬函式與指向基類物件的指標變數的配合使用,就能方便地呼叫同一類族中不同類的同名函式,只要先用基類指標指向即可。
5樓:匿名使用者
c++中虛擬函式的作用:
1、為了方便使用多型特性,我們常常需要在基類中定義虛擬函式。
2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。
為了解決上述問題,引入了純虛擬函式的概念,將函式定義為純虛擬函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以重寫以實現多型性。
同時含有純虛擬函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。
c++中虛擬函式的用法:
比如你有個遊戲,遊戲裡有個虛基類叫「怪物」,有純虛擬函式 「攻擊」。然後派生出了三個子類「狼」「蜘蛛」「蟒蛇」,都實現了自己不同的「攻擊」函式,比如狼是咬人,蜘蛛是吐絲,蟒蛇把你纏起來。
然後出現好多怪物的時候就可以定義一個 虛基類指標陣列,把各種怪物的指標給它,然後迭代迴圈的時候直接 monster[i]->attack() 攻擊玩家就行了,大概見下圖:
6樓:匿名使用者
c++中虛擬函式的作用:
1、方便使用多型特性。
2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。
為了解決上述問題,引入了純虛擬函式的概念,將函式定義為純虛擬函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以重寫以實現多型性。同時含有純虛擬函式的類稱為抽象類,它不能生成物件。
這樣就很好地解決了上述兩個問題。
宣告瞭純虛擬函式的類是一個抽象類。所以,使用者不能建立類的例項,只能建立它的派生類的例項。
純虛擬函式最顯著的特徵是:它們必須在繼承類中重新宣告函式(不要後面的=0,否則該派生類也不能例項化),而且它們在抽象類中往往沒有定義。
定義純虛擬函式的目的在於,使派生類僅僅只是繼承函式的介面。
3、純虛擬函式的意義,讓所有的類物件(主要是派生類物件)都可以執行純虛擬函式的動作,但類無法為純虛擬函式提供一個合理的預設實現。所以類純虛擬函式的宣告就是在告訴子類的設計者,「你必須提供一個純虛擬函式的實現,但我不知道你會怎樣實現它」。
虛擬函式的使用方法是:
1、在基類用virtual宣告成員函式為虛擬函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。在類外定義虛擬函式時,不必再加virtual。
2、在派生類中重新定義此函式,要求函式名、函式型別、函式引數個數和型別全部與基類的虛擬函式相同,並根據派生類的需要重新定義函式體。
c++規定,當一個成員函式被宣告為虛擬函式後,其派生類中的同名函式都自動成為虛擬函式。因此在派生類重新宣告該虛擬函式時,可以加virtual,也可以不加,但習慣上一般在每一層宣告該函式時都加virtual,使程式更加清晰。如果在派生類中沒有對基類的虛擬函式重新定義,則派生類簡單地繼承其直接基類的虛擬函式。
3、定義一個指向基類物件的指標變數,並使它指向同一類族中需要呼叫該函式的物件。
4、通過該指標變數呼叫此虛擬函式,此時呼叫的就是指標變數指向的物件的同名函式。通過虛擬函式與指向基類物件的指標變數的配合使用,就能方便地呼叫同一類族中不同類的同名函式,只要先用基類指標指向即可。
如果指標不斷地指向同一類族中不同類的物件,就能不斷地呼叫這些物件中的同名函式。這就如同前面說的,不斷地告訴計程車司機要去的目的地,然後司機把你送到你要去的地方。
c++中的虛擬函式有什麼作用?
7樓:
類的三個重要特徵:封裝、繼承、多型性。
其中多型性就是通過函式過載(運算子過載實質上也是函式過載)和虛擬函式來實現的。
虛擬函式的作用:在基類用virtual宣告成員函式為虛擬函式,在派生類中重新定義該函式,就可以通過基類指標或引用來訪問基類和派生類中的同名函式。
虛擬函式實現多型性:同一類族中不同類的物件,對同一函式呼叫做出不同的響應。
多型性其實就是一個介面,多種方法,分為靜態多型性和動態多型性,函式過載屬於靜態多型性,在程式編譯時就可確定呼叫哪個函式,其過程稱為靜態關聯或早期關聯,靜態多型性又稱編譯時多型性;虛擬函式屬於動態多型性,在程式執行過程中才動態地確定所呼叫的是那個物件的函式,其過程稱為動態關聯或滯後關聯,動態多型性又稱執行時多型性。
8樓:天蠍神經俠侶
指標的型別是可以強行轉
來轉去的。普通情況你轉什麼型別就調對應型別的同名函式。但是虛擬函式實現多型後,儘管可能你把指標轉成父類的型別,但是因為建立的時候是子類的型別,它還是會呼叫子類的這個虛擬函式。
這樣可以統一**且正確運用子類的新特性。
也因為如此,如果父類虛擬函式不做實現而=0成為純虛擬函式,那麼父類就不可以例項化,這個沒有實現的虛擬函式也永遠不會呼叫。因為根據多型的動態聯編,總是會呼叫例項化了的子類的該方法。指標強行轉成父類也不會呼叫純虛擬函式。
c++裡虛擬函式有什麼作用?
9樓:匿名使用者
含義是讓一個函式具有不同的行為。
舉例來說,人這個類有個函式叫工作!醫生和交版警分別繼承自權人,都具有了工作這個函式,當然醫生的工作內容是治病,交警的工作內容是指揮交通。
現在你需要將交警和醫生同等對待,歸類為人,並分別呼叫其工作函式去執行工作。
如果工作這個函式不是虛擬函式,那你呼叫的就是人的工作函式,無任何意義!相反,如果是虛擬函式,那交警就會去指揮交通,醫生會去治病!
在c++中用虛擬函式的作用是什麼?為什麼要用到虛擬函式
10樓:夜禮服假面
簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛擬函式。虛擬函式的作用,用專業術語來解釋就是實現多型性(polymorphism),多型性是將介面與實現進行分離;用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略。下面來看一段簡單的**
#include
usingnamespacestd;
classa
執行一下看看結果,喲呵,驀然回首,結果卻是兩個this is a。問題來了,p2明明指向的是class b的物件但卻是呼叫的class a的print()函式,這不是我們所期望的結果,那麼解決這個問題就需要用到虛擬函式
classa
};classb:publica
};毫無疑問,class a的成員函式print()已經成了虛擬函式,那麼class b的print()成了虛擬函式了嗎?回答是yes,我們只需在把基類的成員函式設為virtual,其派生類的相應的函式也會自動變為虛擬函式。所以,class b的print()也成了虛擬函式。
那麼對於在派生類的相應函式前是否需要用virtual關鍵字修飾,那就是你自己的問題了。
現在重新執行main2的**,這樣輸出的結果就是this is a和this is b了。
現在來消化一下,我作個簡單的總結,指向基類的指標在操作它的多型類物件時,會根據不同的類物件,呼叫其相應的函式,這個函式就是虛擬函式。
C虛方法的作用,c 中,虛方法的特點是什麼?
他的子類可以重寫也可以不重寫,實現多型 c 中的虛方法究竟有什麼用了 這個區別可就大了。從類這種機制看,你覆蓋是把東西換了,對於這個類來說,以前的方法不存在了。重寫是你在這個類的虛擬函式表 不清楚自己查下 裡增加了一項,並沒有覆蓋,是一種動態性的調整。例子,類a和類b的繼承關係是類b繼承類a,然後有...
C 中,虛基類是如何避免兩義性的
c 的繼承中的基類就是派生類的一個子物件,也就是說基類是派生類的一個子部分,它佔用派生類的一部分記憶體。當b類從a類派生時,b類物件中就會有sizeof a 大小的儲存空間用於儲存a類子物件。當通過b類物件來訪問a類的成員時,產生的訪問指令使用的地址是b物件的起始地址 a物件在b物件的偏移量 a成員...
c 中rand 函式的範圍,c 中rand 函式的範圍
rand函式範圍 在某些平臺下 例如 windows rand max 只有 32768。如果需要的範圍大於 32768,那麼指定 min 和 max 引數就可以生成大於 rand max 的數了,或者考慮用 mt rand 來替代它。rand函式不是真正的隨機數生成器,而srand 會設定供ran...