想問下C 純虛擬函式相比於虛擬函式的直接作用

2025-03-24 09:30:20 字數 4412 閱讀 7416

1樓:南門蘭聲卯

我沒找到官方的定義,以下是我的理解。

虛擬函式:在c++中,以virtual修飾的函式為虛擬函式,可在它的子類中被重寫,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你呼叫凱襲乙個虛擬函式,實際呼叫遲廳的是繼承類的版本。是為了實現多型的概念。

純虛擬函式:只定義函式,並不在基類中去實現它,而是在它在子類中去實現功能。為後來的函式定義乙個框架,碼孫隱防止出現不安全因素;

2樓:無懷雨稅妝

在定義和實現com介面時,純虛擬函式有不可替代的作用。

舉個例子,可能有些牽強,但是能說明問題。

比如,我有乙個類animal,維護了一種動物形象,現在我要實現乙個函式draw,把這個動物畫到任意一種介質上,這種介質可能是螢幕也可能是點陣圖,當然,在螢幕和點陣圖上畫圖形肯定是不一樣的,那麼,我的draw函式肯定要有乙個介質引數,每種介質對應乙個版本的draw函式,這樣很麻煩,有了純虛擬函式,就完全可以定義乙個抽象類,以這個抽象類為引數,只寫乙個版本的draw函式就可以了。

這個抽象類就是晌汪銀把在螢幕和點陣圖上的繪圖行為抽象出來,有點類似gdi+中的graphics類(但它不是個抽象類)的概念,這個類定義有陵配drawrect和drawtext等純虛擬函式,但是不去實現它,而是讓針對螢幕繪圖的子類和針對點陣圖繪圖的子類去實現這些函式。

這樣所有像animal的成員函式draw那樣,需要繪圖的函式,都只需要有乙個抽象類的指標或者引用,就可以繪圖了,這就是純虛擬函式的意義。

再舉個偽**的例子:

classanimal

public:

virtual

sayhi()

無法實現,也沒有必要實現。當然寫個空的虛擬函式也行,但是萬一我的函式需要返回值怎麼辦?強行寫個返回值?宴宴c++的設計者當然不會允許這種情況出現。

完全可以沒有資料成員,因為本來它就是抽象的類,其實也就是介面。

classdog

public

animal

public:

virtual

sayhi()cout

lang;private:

string

langwang

wang";

classcat

public

animal

public:

virtual

sayhi()cout

miaomiao";

雖然抽象類不能例項化,但是可以用它的引用或者指標,這就是純虛擬函式能被利用的關鍵。

這個函式只需要個動物引數,而動物類的所有函式在沒有被具體到或者說繼承到某個動物身上時是無法被實現的,但是所有的具體動物都可以作為引數傳給我的函式,而且只要是動物傳進來,不管是什麼動物,我的函式都能正常的工作,這就是純虛擬函式或者說抽象類的意義。

voidwhatanimal(animal

a);classc

animala;

什麼是抽象類?什麼是純虛擬函式?純虛擬函式跟一般的虛擬函式有什麼區別?

3樓:鳶尾的念想

純虛擬函式和抽象類:

含有純虛擬函式的類是抽象類,不能生成物件,只能派生。他派生的類的純虛擬函式沒有被改寫,那麼,它的派生類還是個抽象類。

定義純虛擬函式就是為了讓基類不可例項化化,因為例項化這樣的抽象資料結構本身並沒有意義。或者給出實現也沒有意義。定義純虛擬函式的一般形式為:

class 類名;

純虛擬函式是乙個在基類中說明的虛擬函式,它在基類中沒有定義,要求任何派生類都定義自己的版本。純虛擬函式為各派生類提供乙個公共介面。

從基類繼承來的純虛擬函式,在派生類中仍是虛擬函式。

4樓:齊哥

抽象類就是含有純虛擬函式的類。純虛擬函式跟虛擬函式在宣告形式上和意義都有很大區別。具體講解可以參見。

c++中 什麼是虛方法

5樓:網友

加了virtual關鍵字的類成員函式,用處嘛,主要是用在多型的情況,不要問我啥叫多型,自己去查資料。

6樓:未來還是夢

虛擬函式提供一類操作的統一命名。

由於類包含的內容比較廣,下面還有不同的子類,雖然操作的名稱相同,但是對於不同的子類,其具體實現不同。因此,在本類中無法統一表達;但是另一方面,此類操作具有共性,因此使用乙個統一的命名。其具體的實現,有各個不同的子類完成。

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

7樓:似羽喻端靜

可以讓成員函式操作一般化,用基類的指標指向不同的派生類的物件時,基類指標內呼叫其虛成員函式,容則會呼叫其真正指向物件的成員函式,而不是基類中定義的成員函式(只要派生類改寫了該成員函式)。

若不是虛擬函式,則不管基類指標指向的哪個派生類物件,呼叫時都會呼叫基類中定義的那個函式。

c++考題中提到純虛擬函式是什麼概念?起什麼作用?

8樓:

純虛擬函式(我的解釋不官方,希望能幫助你理解):1.什麼是純虛擬函式; 基類中,使用 virtual 函式名() = 0;的寫法就是純虛擬函式了。

2.用處 。在基類中不能對虛擬函式給出有意義的實現,就把它宣告為純虛擬函式。

3.用法。含有純虛擬函式的類,叫做虛基類。 虛基類不能例項化。子類去實現這個純虛擬函式後,才能例項化。

個人理解的它最重要的作用:強制子類重寫該函式。

9樓:匿名使用者

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

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

virtual void funtion1()=0

引入原因/純虛擬函式的作用。

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

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

為了解決上述問題,引入了純虛擬函式的概念,將函式定義為純虛擬函式(方法:virtual returntype function()=

0;),則編譯器要求在派生類中必須予以重寫以實現多型性。同時含有純虛擬函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。

10樓:西晉溝贍

如今與你要面對多少傷痛和迷惑。

關於c++虛擬函式的乙個蠢蠢的問題

11樓:老馮文庫

此時呼叫的是b類的x()函式。

a *p;p = new b();

p->x();//一定是呼叫b類的x()方法,因為p是b類物件。

a *)p)->x();//仍然呼叫b類的x()方法,理由同上。

a p;p = b();

/呼叫a類的x()方法,因為p是a類物件,即使使用b類構造。

a)p).x();//呼叫a類的x()方法,理由同上。

12樓:網友

指標指向b的物件的話,呼叫的就是b裡面實現的函式啊,呼叫哪乙個函式取決於具體的物件到底是哪乙個類的物件。

虛擬函式或純虛擬函式主要用來解決什麼問題?

13樓:網友

它們的用途是兩個方面。

純虛擬函式主要是為了使所在的類當介面用,因為定義了純虛擬函式的類不能定義例項。

虛擬函式主要是為了實現多型。

兩者的相近就在於如果你派生自乙個純虛基類,你過載了純虛擬函式,你的新函式就肯定是乙個虛擬函式。

14樓:網友

虛擬函式主要是實現多型性,使得子類和父類的同名方法可以有不同的功能實現。

純虛擬函式,說實話我也不理解它存在的意義。

因為他要求在子類中必須被實現,可是類似的需求只要用介面就可以了,而且還要靈活的多。

15樓:網友

虛擬函式,用於多型, 父類和子類的相同函式有不同的行為。

純虛擬函式,就是子類必須實現的虛擬函式,不實現編譯不通過。

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

16樓:李李李

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

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

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

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

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

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

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

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

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

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

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