1樓:鳶尾的念想
純虛擬函式和抽象類:
含有純虛擬函式的類是抽象類,不能生成物件,只能派生。他派生的類的純虛擬函式沒有被改寫,那麼,它的派生類還是個抽象類。
定義純虛擬函式就是為了讓基類不可例項化化,因為例項化這樣的抽象資料結構本身並沒有意義.或者給出實現也沒有意義。定義純虛擬函式的一般形式為:
class 類名;
純虛擬函式是一個在基類中說明的虛擬函式,它在基類中沒有定義,要求任何派生類都定義自己的版本。純虛擬函式為各派生類提供一個公共介面。
從基類繼承來的純虛擬函式,在派生類中仍是虛擬函式。
2樓:齊哥
抽象類就是含有純虛擬函式的類。純虛擬函式跟虛擬函式在宣告形式上和意義都有很大區別。具體講解可以參見 http:
//****jizhuomi.***/software/125.
html 。
什麼是虛擬函式和純虛擬函式,有什麼區別
3樓:
虛擬函式是在基類中作總體框架定義,定義時在函式的返回型別名前加上virtual構成。它的具體不同實現版本是在其類的派生類裡實現的。純虛擬函式是在其類中連基本框架都定義不出來,所以只是用「virtual 型別名 函式名()=0;」的形式來宣告基類中有這麼一個函式,而它的實現則完全由基類的派生類根據不同需要來完成。
有純虛擬函式的基類叫抽象類,不能被例項化(即不能生成物件),只能被繼承。我的理解是:虛擬函式實現的具體版本中總是有通用的部分,這些通用部分可以在基類中定義,而純虛擬函式則完全沒有能共用的部分,完全是由派生類中不同的實現完成的。
供參考……
4樓:匿名使用者
自己看書吧,書上說的比誰都清楚。推薦一本, c++ primer plus...
有純虛擬函式的類和有虛擬函式的類相比,又有什麼區別
5樓:匿名使用者
純虛擬函式的類在其派生類中必須定義自己這個函式的版本,而且純虛擬函式是沒有實際意義的,他的目的告知編譯器派生類將會定義自己的版本。
類中擁有純虛擬函式表示這個類是抽象類,不存在此類的物件。
而虛擬函式僅表示派生類可以定義自己的版本,但是基類也可以有意義,若沒有定義自己的版本,將使用基類的版本。
6樓:匿名使用者
純虛擬函式是一種特殊的虛擬函式,它的一般格式如下:
class 《類名》
;在許多情況下,在基類中不能對虛擬函式給出有意義有實現,而把它說明為純虛擬函式,它的實現留給該基類的派生類去做。這就是純虛擬函式的作用。
[編輯本段]
二、引入原因
1、為了方便使用多型特性,我們常常需要在基類中定義虛擬函式。
2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。
為了解決上述問題,引入了純虛擬函式的概念,將函式定義為純虛擬函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以過載以實現多型性。同時含有純虛擬函式的類稱為抽象類,它不能生成物件。
這樣就很好地解決了上述兩個問題。
[編輯本段]
三、相似概念
1、多型性
指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的實現動作。c++支援兩種多型性:編譯時多型性,執行時多型性。
a.編譯時多型性:通過過載函式實現
b 執行時多型性:通過虛擬函式實現。
2、虛擬函式
虛擬函式是在基類中被宣告為virtual,並在派生類中重新定義的成員函式,可實現成員函式的動態過載
3、抽象類
包含純虛擬函式的類稱為抽象類。由於抽象類包含了沒有定義的純虛擬函式,所以不能定義抽象類的物件。
程式舉例:
基類:class a
;子類:
class b : public a
;主函式:
int main(int argc, char* argv)
f1()是一個隱藏,關於函式的隱藏,可以參考其它詞條.
呼叫m_j->f1();會去呼叫a類中的f1(),它是在我們寫好**的時候就會定好的.
也就是根據它是由a類定義的,這樣就呼叫這個類的函式.
f2()是普通的過載.
呼叫m_j->f2();會呼叫m_j中到底儲存的物件中,對應的這個函式.這是由於new的b
物件.f3()與f2()一樣,只是在基類中不需要寫函式實現.請參考
《c++》中虛擬函式與純虛擬函式的區別是什麼?
7樓:月無痕
虛擬函式與純虛擬函式 在他們的子類中都可以被重寫。它們的區別是:
(1)純虛擬函式只有定義,沒有實現;而虛擬函式既有定義,也有實現的**。
純虛擬函式一般沒有**實現部分,如
virtual void print() = 0;
而一般虛擬函式必須要有**的實現部分,否則會出現函式未定義的錯誤。
virtual void print()
(2)包含純虛擬函式的類不能定義其物件,而包含虛擬函式的則可以。
c#的抽象類中,抽象方法和純虛擬函式區別
8樓:曹朕植
問題1:含有virtual修飾符的方法稱為虛擬方法。不能像你說的那樣定義。
問題2:
1)虛擬方專法,子屬類可以選擇性重寫此方法,也可以不重寫;而抽象(abstract
)方法,子類必須重寫。
2)虛擬方法可以有實體,如:
public virtual void vt()所以,可以直接呼叫虛擬方法;而抽象方法不能宣告方法實體,public abstract void ab(),不能直接呼叫。
3)虛方法可以實現多型,而抽象方法不可以
如果一個類被宣告為abstract,
則在該抽象類中,可以存在沒有實現的方法,但該方法須宣告為abstract,
在其子類中,通過override關鍵字修辭幷包含具體的實現抽象類中的虛方法使用virtual關鍵字描述,並在子類中實現與抽象方法不同的是,虛方法可以有具體的實現,而抽象方法不可以有實現,類似於介面中規範的定義
9樓:一郎大神
1.沒有你說的純虛擬函式,但是可以用委託通過匿名函式達到類似的效果。比如使用lambda表示式,x => x * 6指定名內為x的參容數並返回x的值計算的。
如下面的示例所示,可以將此表示式傳遞給委託型別:
delegate int del(int i);
static void main(string args)2. 虛方法必須有實現部分,併為派生類提供了覆蓋該方法的選項;
抽象方法沒有提供實現部分,抽象方法是一種強制派生類覆蓋的方法,否則派生類將不能被例項化。
10樓:
問題1:含有
baivirtual修飾符的方法du稱為虛擬方法。不能像zhi你說的那dao樣定義。
問題2:
1)虛擬方法,專子類可以屬選擇性重寫此方法,也可以不重寫;而抽象(abstract
)方法,子類必須重寫。
2)虛擬方法可以有實體,如:
public virtual void vt()所以,可以直接呼叫虛擬方法;而抽象方法不能宣告方法實體,public abstract void ab(),不能直接呼叫。
3)虛方法可以實現多型,而抽象方法不可以
11樓:破曉崇明
如果來一個類被宣告為abstract,
則在該源抽象類中,可以存在沒有實現的方法,但該方法須宣告為abstract,
在其子類中,通過override關鍵字修辭幷包含具體的實現抽象類中的虛方法使用virtual關鍵字描述,並在子類中實現與抽象方法不同的是,虛方法可以有具體的實現,而抽象方法不可以有實現,類似於介面中規範的定義
12樓:匿名使用者
高質量認證每次進來都是好幾年之前的問題了。
什麼叫做抽象類,抽象類有何作用,抽象類的派生類是否一定要給出純虛擬函式的實現?
13樓:匿名使用者
抽象類是含有純虛擬函式的類並沒有實現純虛擬函式函式體的類;
作用:抽象類回顧名思義是答一個抽象的概念,具體沒有講他怎麼做;
他是在子類中實現的,這是一個具體化的過程,如果子類中沒有全部實現純虛構函式的函式體部分那其子類依舊是一個抽象類。
抽象類的派生類不一定要給出純虛構函式的實現,給出所有純虛擬函式的實現那該派生類就不再是抽象類,而沒有給出其純虛構函式的實現,那該純虛擬函式依舊是抽象類。
望採納!
虛擬函式和抽象函式有什麼區別?
14樓:許詩文
虛擬函式是有**的並明確允許子類去覆蓋,但子類也可不覆蓋,就是說可以直接用,不用重寫 。
抽象函式是沒有**,子類繼承後一定要重寫
在一個類中用虛擬函式:
是因為在超類中的有實際**的方法,但明確允許子類可以作重寫
而且當子類重寫後,可以用子類例項超類;如果這樣,超類變數呼叫虛擬函式時,執行的是子類的方法
在一個類中用抽象函式
是在寫超類時不確定函式的**,讓子類去實現
抽象函式沒有方法體。
簡單來說虛擬函式(virtual)已經包含了也必須包含預設的實現,所以在派生類中可以重新實現也可以不實現這些虛擬函式。
抽象函式(abstract)沒有提供預設實現,所以在派生類中必須實現這些抽象函式。
介面中的函式類似於抽象函式,也不提供預設實現,實現介面的類也必須實現這些函式。
但介面可用於多繼承,即,類只能從一個類繼承,但可同時實現多個介面。
15樓:匿名使用者
純虛擬函式是一種特殊的虛擬函式,它的一般格式如下:
class <類名>
;在許多情況下,在基類中不能對虛擬函式給出有意義有實現,而把它說明為純虛擬函式,它的實現留給該基類的派生類去做。這就是純虛擬函式的作用。
抽象類帶有純虛擬函式的類稱為抽象類。抽象類是一種特殊的類,它是為了抽象和設計的目的而建立的,它處於繼承層次結構的較上層。抽象類是不能定義物件的,在實際中為了強調一個類是抽象類,可將該類的建構函式說明為保護的訪問控制許可權。
抽象類的主要作用是將有關的組織在一個繼承層次結構中,由它來為它們提供一個公共的根,相關的子類是從這個根派生出來的。
在c++中純虛擬函式和抽象類的具體用途是什麼,他們的區別是什麼
16樓:匿名使用者
從名字bai上就能
看出來,純du虛擬函式是一種「函式」zhi
,抽象類是一dao種版」類「,函式和類,自權然是最大的區別。
它們的用途是定義抽象的介面。
純虛擬函式是指沒有具體實現的虛擬函式,一個類包含了純虛擬函式就成為了抽象類,這樣的類不能被建立例項,所以可以作為抽象介面,由子類來定義純虛擬函式的具體實現。
抽象類中的已經宣告一個方法=0為純虛擬函式,其他方法不宣告=0,有區別嗎?
17樓:匿名使用者
一個是虛擬函式,一個是純虛擬函式。另外你的函式忘寫返回值了。。純虛擬函式可以讓類先具有一個操作名稱,而沒有操作內容,讓派生類在繼承時再去具體地給出定義。
凡是含有純虛擬函式的類叫做抽象類。這種類不能宣告物件,只是作為基類為派生類服務。除非在派生類中完全實現基類中所有的的純虛擬函式,否則,派生類也變成了抽象類,不能例項化物件。
18樓:匿名使用者
修改之前
virtual fun1();
virtual fun2();
這兩個函式在基類中還是需要實現的。
修改後,變成純需函式,所以不用實現了。
關於C純虛擬函式和抽象類的題一個關於C純虛擬函式和抽象類的題
a的想法確實是錯了,選a沒問題,但c也錯了a 純虛擬函式在類中可以有具體的實現 但是有純虛擬函式的類無法有具體的實現而已.純虛擬函式在派生類中必須被重新定義,但純虛擬函式的實現 還是可以被派生類用 baseclass thevirtualfn 這種方式呼叫.b 沒問題,具有純虛擬函式的類確實是抽象類...
什麼是虛熱?吃點什麼好?虛熱要吃什麼食物?
是由於陰虛的原因。患者一般情況下,陰陽都不算壯,就因為陰虛所以就顯得陽盛 但不是真的盛 表現為虛熱。其實虛熱真的到了冷天還是怕冷的!假熱嘛!調製的方法,可以服用些滋陰的藥物 平時一定要注意早睡,因為前半夜對於養陰的人很重要!陰陽氣血虛虧引起的發熱。醫學入門 卷五 凡虛熱皆因精神外弛,嗜慾無厭,陰氣耗...
什麼是虛牆,天正裡的虛牆是什麼意思
虛牆主要應用在分割房間和封閉房間的作用,例樓梯和休息平臺 需要計算建築面積的伸縮縫處。虛牆是一虛擬的構件,它本身不計算任何工程量,但它具備普通牆的功能,起分隔和圍護房間的作用,雖然虛牆本身不計算任何工程量,但卻可以借用他來計算其它的工程量,功能還是很強大的。虛牆是用作空間的邊界,常用來劃分邏輯空間,...