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

2021-03-04 00:48:46 字數 3105 閱讀 9593

1樓:李李李

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

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

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

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

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

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

2樓:月無痕

虛擬函式與純虛擬函式 在他們的子類中都可以被重寫。它們的區別是:

(1)純虛擬函式只有定義,沒有實現;而虛擬函式既有定義,也有實現的**。

純虛擬函式一般沒有**實現部分,如

virtual void print() = 0;

而一般虛擬函式必須要有**的實現部分,否則會出現函式未定義的錯誤。

virtual void print()

(2)包含純虛擬函式的類不能定義其物件,而包含虛擬函式的則可以。

什麼是c++虛擬函式,虛擬函式的作用和使用方法

3樓:何度千尋

在某基類中宣告為 virtual 並在一個或多個派生類中被重新定 義的成員函式,用法格式為:virtual 函式返回型別 函式名(參數列) ;實現多型性,通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。

虛擬函式定義:簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛擬函式。虛擬函式的作用,用專業術語來解釋就是實現多型性(polymorphi**),多型性是將介面與實現進行分離;用形象的語言來解釋就是實現以共同的方法,但因個體差異,而採用不同的策略。

虛擬函式的作用:用同一個呼叫形式,既能呼叫派生類又能呼叫基類的同名函式。

虛擬函式的使用方法是:

在基類用virtual宣告成員函式為虛擬函式。

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

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

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

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

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

通過虛擬函式與指向基類物件的指標變數的配合使用,就能方便地呼叫同一類族中不同類的同名函式,只要先用基類指標指向即可。如果指標不斷地指向同一類族中不同類的物件,就能不斷地呼叫這些物件中的同名函式。這就如同前面說的,不斷地告訴計程車司機要去的目的地,然後司機把你送到你要去的地方。

4樓:匿名使用者

當一個基類或虛基類派生了多個子類時,並且這些子類都重寫了基類的一個虛擬函式,那麼當你建立了多個子類物件時,可以把這些物件組成一個基類陣列,通過類基物件或基類物件指標可以呼叫同一個函式名而執行的是不同的子類的函式,這就是虛擬函式最根本的用途,這是一個後期繫結機制,在編譯前,物件的型別是不可知的。在編譯時才確定物件的型別,從而呼叫合適的函式。

class a

;class b : public a

;int main(int argc, char* argv)

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

5樓:

類的三個重要特徵:封裝、繼承、多型性。

其中多型性就是通過函式過載(運算子過載實質上也是函式過載)和虛擬函式來實現的。

虛擬函式的作用:在基類用virtual宣告成員函式為虛擬函式,在派生類中重新定義該函式,就可以通過基類指標或引用來訪問基類和派生類中的同名函式。

虛擬函式實現多型性:同一類族中不同類的物件,對同一函式呼叫做出不同的響應。

多型性其實就是一個介面,多種方法,分為靜態多型性和動態多型性,函式過載屬於靜態多型性,在程式編譯時就可確定呼叫哪個函式,其過程稱為靜態關聯或早期關聯,靜態多型性又稱編譯時多型性;虛擬函式屬於動態多型性,在程式執行過程中才動態地確定所呼叫的是那個物件的函式,其過程稱為動態關聯或滯後關聯,動態多型性又稱執行時多型性。

6樓:天蠍神經俠侶

指標的型別是可以強行轉

來轉去的。普通情況你轉什麼型別就調對應型別的同名函式。但是虛擬函式實現多型後,儘管可能你把指標轉成父類的型別,但是因為建立的時候是子類的型別,它還是會呼叫子類的這個虛擬函式。

這樣可以統一**且正確運用子類的新特性。

也因為如此,如果父類虛擬函式不做實現而=0成為純虛擬函式,那麼父類就不可以例項化,這個沒有實現的虛擬函式也永遠不會呼叫。因為根據多型的動態聯編,總是會呼叫例項化了的子類的該方法。指標強行轉成父類也不會呼叫純虛擬函式。

7樓:匿名使用者

virtual 關鍵詞可以將一個類的函式

說明為虛擬函式

虛擬函式的主要用處是對派生類實現動態聯編.舉例說明一下:

class a

}class b:public a

}void main()

由上面簡單的例子可知,一個基類的指標可以指向他的子類,使用該指標呼叫函式時,如果呼叫的函式在基類中被說明為虛擬函式,那麼子類中該函式也自動成為虛擬函式,呼叫時會根據指標所指向的物件呼叫相應類的虛擬函式.實現動態聯編.

更詳細的說明你可以看一下虛擬函式表

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

8樓:呵呵

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

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

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

C虛擬函式和純虛擬函式的區別,c中虛擬函式與純虛擬函式的區別是什麼?

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

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

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

虛擬函式和虛基類的區別是什麼啊,c 中虛擬函式與純虛擬函式的區別是什麼?

虛擬函式 虛基類,它們都和virtual有關,這兩個帶有虛字的定義容易使人混淆,回下面先從作用答 上來解釋這兩個定義的區別 1.虛擬函式是用於多型中virtual修飾父類函式,確保父類指標呼叫子類物件時,執行子類函式的。2 虛基類是用來在多繼承中,如果父類繼承自同一個父類,就只例項化一個父類 說的有...