我們為什麼要在C 中使用虛函式

2022-08-30 16:24:26 字數 1132 閱讀 2003

類中的成員函式分為靜態成員函式和非靜態成員函式,而非靜態成員函式又分為普通函式和虛函式。

至於為什麼虛函式必須是非靜態成員函式,可以看一下:

我們在類中定義函式的時候,在前面加上virtual就可以宣告為虛函式。

接下來我們看乙個例子:

#include#includeusing namespace std;

class student

;student::student(string n,string nam,int sco)

void student::display()

執行結果:

/*

num:001

name:qianshou

score:100

**********====沒有節操的分割線***************=

num:001

name:qianshou

score:100

university:sdnu

*/

p是基類指標,當它指向基類的物件時,呼叫的display函式為基類中的成員函式,當它指向派生類的物件時,呼叫的display函式為派生類中的成員函式。

這就難免出現乙個問題,我們為什麼要用指向基類的指標指向派生類,然後再通過指標呼叫派生類中的成員函式呢?

為什麼不直接建立乙個指向派生類的指標,然後呼叫成員函式呢?這樣都沒有必要在基類中宣告虛函式了。

我們考慮這樣乙個問題,如果我們要去乙個城市的好多不同的地方,如果我們乘坐公交車的話,每去乙個地方就需要選擇不同的公交車;而如果我們乘坐計程車的話,我們只需要找乙個計程車,然後不斷告訴它不同的地點,它就能夠帶我們去不同的地方。

道理是相似的:

乘坐公交車:

假如乙個基類有20個派生類,當我們分別訪問這21個派生類和基類的時候,我們就需要為每乙個類建立乙個指標,然後通過不同的指標去訪問不同的類的物件,就好像我們通過乘坐不同的公交車到達不同的地點一樣。

乘坐計程車:

如果我們在基類中建立相應的虛函式,我們就只需要建立乙個指向基類的指標。當我們需要訪問該基類或者它的20個派生類的時候,我們只需將相應的類的位址賦給指向基類的指標,即可訪問該派生類中的虛函式。就像我們在做計程車的時候,不斷告訴司機我們的下乙個位址一樣。

為什麼不能在建構函式中使用虛函式

先上 c datastructure.cpp 定義控制台應用程式的入口點。此時發揮作用的是base fun 而不是派生類a fun 也就是虛函式在建構函式中不起作用。當例項化乙個派生類物件時,首先進行基類部分的構造,然後再進行派生類部分的構造。即建立a物件時,會先呼叫base的建構函式,再呼叫a的建...

我們為什麼要在計算機中使用二進位制

everything over binary 眾所周知,計算機中的資料,指令都是二進位制形式的,為什麼明明我們在日常生活中都是使用十進位制,而在計算機中偏偏採用二進位制呢?從某種角度上來說,算是不得已而為之。追溯到遠古,那時候的人們採用十進位制的原因我猜想應該是因為我們有十個手指頭,採用十進位制方便...

為什麼不要在MySQL中使用UTF 8編碼方式

mysql 從 4.1 版本開始支援 utf 8,也就是 2003 年,然而目前流行的utf 8 標準 rfc 3629 是在此之後規定的。正因此,才造就了mysql中的utf 8與我們日常開發中的utf 8不一致,從到導致了些問題。mysql的utf 8只支援每個字元最多三個位元組,而真正的 ut...