C 裡的虛擬函式是不是沒什麼用處

2021-03-27 11:53:27 字數 5023 閱讀 2712

1樓:匿名使用者

虛擬函式就相當於是在執行過程中的過載,它就是提供一個對外的預設介面。如果派生類中定義了這個藉口,就使用派生類自己定義的介面,如果沒有定義就用基類的。這就像我們買了一個u盤在windows下使用,windows自帶了一個u盤的介面驅動程式,u盤也有一個自身的驅動程式。

我們將u盤直接插到電腦上,用windows自帶的程式也能正常使用u盤,可如果我們把u盤自帶的驅動程式裝上,那是用的就是自帶的驅動,而這個驅動可能會比windows的好用,可能使u盤存取速度更快。有點羅嗦。。虛擬函式應該明白了吧。

虛基類。。在多重繼承中會產生二義性,虛基類正是用來解決二義性的方法。至於什麼是二義性,看下面**

class a

;class b:public a

{};class c:public b

{};class d:public a,public b

{};類b和c都是從類a繼承下來的,在b和c中都應該分別有一個show();類d是從b和c繼承而來的,那麼在d中應該有兩個相同的show();這時如果呼叫d中的show();,就不知道到底要呼叫哪個,因為這兩個函式沒有區別,當然可以用成員名限定的方法來呼叫,可這不是根本的解決方法,所以就有了虛基類。虛基類可以使多層繼承路徑中的公共基類只產生一個例項。這就減少了很多重複**,節省開銷。

下面說一下介面

說到介面就要提到純虛擬函式、抽象類。純虛擬函式就是在基類中不提供函式實現,而要在派生類中提供實現。至少有一個純虛擬函式的類成為抽象類。

純虛擬函式格式,比如上面的**,把類a中改為

virtual show()=0;這就是一個純虛擬函式。在它的派生類中必須要提供實現。那麼這就是一個藉口的概念。

還以windows為例。我們使用的軟體、硬體多得無法計算。windows不可能為每一種軟硬體都提供一個預設的驅動。

於是windows就提供一個介面,如果一款軟體或硬體想在windows上執行的話,好,那你根據我的介面規則,自己開發驅動程式。所以純虛擬函式和虛擬函式的區別就是虛擬函式有一個預設的實現,而純虛擬函式沒有。就是開發者不提供自己產品的驅動,在純虛擬函式為介面時就不能使用,但在虛擬函式做介面時就可以使用

樓主說「認真點,多定義幾個物件」這句我沒明白指的是什麼,但我要告訴你,建立一個物件的話,是要調構造、析構等等,反正開銷是很大的,所以能不建立物件就能解決的問題就不要建立物件。

2樓:匿名使用者

用處很大

多型就需要用虛擬函式

介面通常指類提供給外部呼叫它的函式,可狹義理解為一個class的public method

推薦看一下thinking in c++,三言兩語是說不清楚的

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樓:何度千尋

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

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

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

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

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

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

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

8樓:匿名使用者

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

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

C語言函式名是不是指標這個指標儲存著什麼是什麼的地址

可以定義一個函式指標,比如char prefect char p 5 int n 這個就是定義一個字元指標函式,他定義的引數是陣列指標。他返回一個指向字元型別的地址。還有我們還可以定義一個函式指標變數 int pf int add int i,int j pf add k pf i,j 函式名 不是...

c語言的基礎學完了但是我怎麼感覺沒什麼用呢

c語言四書五經,書店,都有賣的。先把它準備好。然後看著有一定程度後,把它的題目都在你的本本上敲出結果來。目的 學習動手程式設計!接下來分析linux核心或者網絡卡驅動程式,目的 瞭解思路!國人的書只合適考試的。建議不要看,什麼譚的,無語中,都是些計算,加減乘除的。要看看外國的書,還有一點,在工作中,...

c中的行內函數有什麼用?怎麼用,C 中的行內函數有什麼用?怎麼用?

先把樓上的貼上來,下面是自己的 行內函數和成員函式沒什麼區別,區別就在於怎樣加快函式的執行速度而已 1 行內函數可減少cpu的系統開銷,並且程式的整體速度將加快,但當行內函數很大時,會有相反的作用,因此一般比較小的函式才使用行內函數 2 有兩種行內函數的宣告方法,一種是在函式前使用inline關見字...