高手替我解釋C 中virtual,要詳細,謝謝

時間 2021-08-30 09:08:44

1樓:匿名使用者

我剛才粘了那麼詳細 竟然沒顯示?!

這樣 我自己舉例吧

假設中國人(子類) 繼承自 人(基類)

人(基類)定義了一個函式叫“吃晚飯”(可以定義為用手抓飯)如果這個函式不是virtual的話

那麼 下列**

person* p = new chinese();

p->eatdinner();

呼叫的是 人(基類)的“吃晚飯” 而不是中國人的吃飯習慣而 如果這個函式是virtual的話

那麼 同樣的**

p->eatdinner();

呼叫的是 中國人的“吃晚飯”函式 也就是用筷子吃麵等等具體的內部實現呢 是基類有一個虛擬函式表

記錄所有的virtual函式

這樣 如果子類把基類的virtual函式給實現了(有自己的一套吃飯辦法)

那麼 虛擬函式表裡的這個函式就指向子類的那個函式否則 就指向基類

這就是“晚繫結”——不在編譯期間 而是執行期繫結子類已經覆蓋的函式

c++ 把virtual加在類的函式前到底是什麼意思呢?

2樓:匿名使用者

virtual說明此函式會在繼承此類的某一個子類中實現,而在此類中卻不實現。。。

3樓:匿名使用者

宣告該函式為虛擬函式,將父類的函式宣告為虛擬函式,那麼該函式在其子類裡可以有不同的實現,完成不同的功能。

4樓:天堂隔壁

virtual 函式返回值型別 虛擬函式名(形參表)虛擬函式必須是基類的非靜態成員函式,其訪問許可權可以是protected或public。

詳細資料見

5樓:匿名使用者

宣告為虛擬函式,在子類中可重新定義該函式。

6樓:匿名使用者

虛擬函式,然後這個類以及其派生類都會有一個稱為虛表的指標組,每一個指標指向一個函式。然後如果派生類改變了基類的虛擬函式的定以,則那個指標就會重新指向這個函式。

c++中的virtual關鍵字是什麼?怎麼用?

7樓:墨陌沫默漠末

virtual是定義c++中虛擬函式的關鍵字 。

在使用virtual之前,c++對成員函式使用靜態聯編,而使用virtual,並且在呼叫函式時是通過指標或引用呼叫,c++則對成員函式進行動態聯編。

用法:class base

public:

virtual void print()

}; class derived:public base

public:

void print()

}; int main()

output:

derived

c++11 關鍵字共73個。

新增關鍵字:alignas、alignof、char16_t、char32_t、constexpr、decltype、noexcept、nullptr、static_assert、thread_local。

export 因為實現支援太少(僅edison design group的前端支援),編譯效率低下,取消原有意義(仍是關鍵字,但使用它的程式是錯誤的),改為保留給未來標準使用。

1、alignas

alignof用於獲取取指定表示式指定的(類似sizeof,可以直接是型別名)的對齊(alignment)。alignas用於宣告時指定對齊類似於現有的型別。和sizeof類似,兩者的運算元都不被求值。

2、constexpr

類似const但更強大,修飾函式或物件,表示函式結果或物件是編譯時決定的常量,以便優化。(const不能修飾一般的函式,也不一定指定宣告的物件能編譯期的常量表示式,更可能只是只讀物件。而在c語言中,const完全只能指定只讀物件。

)3、char16_t 和 char32_t

二者分別表示16位字元型和32位字元型,類似char和wchar_t,也是一般只專用於表示字元的整數型別,且設計上用於表示unicode字元。char16_t和char32_t是c++11新增的,以克服wchar_t在不同平臺上無法保證確定寬度的缺點。

8樓:機智的煎餅

c++中的virtual關鍵字是定義c++中虛擬函式的關鍵字 。

在使用virtual之前,c++對成員函式使用靜態聯編,而使用virtual,並且在呼叫函式時是通過指標或引用呼叫,c++則對成員函式進行動態聯編。

virtual的作用:

(1)以父類的引用作為函式的引數型別。

(2)呼叫該函式傳遞子類物件。

(3)在函式中可以通過該父類的引用呼叫到子類中重寫的虛擬函式。

c++語言工作原理

c++語言的程式因為要體現高效能,所以都是編譯型的。但其開發環境,為了方便測試,將除錯環境做成解釋型的。即開發過程中,以解釋型的逐條語句執行方式來進行除錯,以編譯型的脫離開發環境而啟動執行的方式來生成程式最終的執行**。

生成程式是指將原始碼(c++語句)轉換成一個可以執行的應用程式的過程。如果程式的編寫是正確的,那麼通常只需按一個功能鍵,即可搞定這個過程。該過程實際上分成兩個步驟。

第一步是對程式進行編譯,這需要用到編譯器(compiler)。編譯器將c++語句轉換成機器碼(也稱為目標碼);如果這個步驟成功,下一步就是對程式進行連結,這需要用到連結器(linker)。

連結器將編譯獲得機器碼與c++庫中的**進行合併。c++庫包含了執行某些常見任務的函式(“函式”是子程式的另一種稱呼)。

例如,一個c++庫中包含標準的平方根函式sqrt,所以不必親自計算平方根。c++庫中還包含一些子程式,它們把資料傳送到顯示器,並知道如何讀寫硬碟上的資料檔案。

9樓:染塵墨羽

是定義c++中虛擬函式的關鍵字。

class base

public:

virtual void print()

};class derived :public basepublic:

void print()

};void main()

10樓:大野瘦子

virtual是c++ oo機制中很重要的一個關鍵字,在類base中加了virtual關鍵字的函式就是虛擬函式。

關鍵字virtual的用法:

#include

using namespace std;

class a;

class b :  public a;

void dodisplay(a *p)

int main(int argc,char* argv)

這段**列印出的結果為b,但是當把a類中的virtual去掉之後列印出的就為a。當基類中沒有virtual的時候,編譯器在編譯的時候把p看做a類的物件,呼叫的自然就是a類的方法。

但是加上virtual之後,將dispaly方法變成了虛方法,這樣呼叫的時候編譯器會看呼叫的究竟是誰的例項化物件,這樣就實現了多型的效果。

也就是說,當基類的派生類中有重寫過基類的虛方法的時候,使用基類的指標指向派生類的物件,呼叫這個方法實際上呼叫的會是派生類最後實現的方法。

11樓:123飯後娛樂

virtual意為虛擬,在c++中用到關鍵字virtual的一共有兩個部分一個是虛繼承,一個是虛擬函式。

c++中的函式呼叫預設不適用動態繫結。要觸發動態繫結,必須滿足兩個條件:第一,指定為虛擬函式;第二,通過基類型別的引用或指標呼叫。

下面這些情況可用virtual關鍵字:

友元函式 建構函式 static靜態函式 不能用virtual關鍵字修飾;

普通成員函式 和解構函式 可以用virtual關鍵字修飾;

擴充套件資料:

vitual關鍵字用途:

vitual基類

在多重繼承中,從派生類到基類存在多條路線時(多個繼承脈絡或者途徑),一個這種派生類的物件例項化將包含多個基類物件,浪費資源且呼叫混亂的現象出現。

因此引入了vitual baseclass,來在執行階段克服多個基類物件的產生。這個vitual是在執行階段保證物件唯一性的。

vitual函式

虛擬函式的出現,是由於基類的指標可以執行派生類,因此引出了不便,如

class deriv:public class base

當deriv d;

base* b;

b=&d;

b->show();

這裡的show應該呼叫誰的呢?我們的意思肯定是呼叫d的,但是編譯器處理的話b和base類是繫結在一起的,他實際上是會呼叫b的show函式。

因此,我們引入vitual函式,來告訴編譯器,出現這種情況時,在執行時動態連結進行處理。

3.vitual在純虛擬函式中使用

純虛擬函式完全是為了繼承體系的完整,也是整合vitual函式的作用而產生的。代表了編譯器階段物件的繫結,將呼叫選擇轉移到執行時動態繫結。

綜上:vitual關鍵的引入,可以理解為阻止編譯階段的靜態繫結,將繫結(虛擬函式)和約束工作(虛基類)轉移到執行時動態處理。

12樓:檀香透窗櫺

virtual是定義c++中虛擬函式的關鍵字 。

1、virtual關鍵字的作用:

c++中的函式呼叫預設不適用動態繫結。要觸發動態繫結,必須滿足兩個條件:第一,指定為虛擬函式;第二,通過基類型別的引用或指標呼叫。由此可見,virtual主要功能是實現動態繫結。

2、virtual關鍵字的使用情況:

virtual可用來定義類函式和應用到虛繼承。

友元函式 建構函式 static靜態函式 不能用virtual關鍵字修飾;

普通成員函式 和解構函式 可以用virtual關鍵字修飾。

3、virtual關鍵字的效果:

class grandfather //祖父類

//建構函式

virtual void fun()  //虛擬函式宣告定義

};class father : public grandfather//父類,公有繼承祖父類

//建構函式

void fun()   //fun函式宣告定義

};class son : public father  //子類,公有繼承父類

//建構函式

void fun()  //fun函式宣告定義

};void print(grandfather* father) //輸出函式 ,祖父類形參

int _tmain(int argc, _tchar* argv)

4、virtual的繼承性:

只要基函式定義了virtual,繼承類的該函式也就具有virtual屬性;即 grandfather, father ,son同時定義virtual void fun()與grandfather一個定義virtual void fun效果是一樣的。

擴充套件資料

vitual關鍵字的用途:

1、vitual基類

在多重繼承中,從派生類到基類存在多條路線時(多個繼承脈絡或者途徑),一個這種派生類的物件例項化將包含多個基類物件,浪費資源且呼叫混亂的現象出現。

因此引入了vitual baseclass,來在執行階段克服多個基類物件的產生。這個vitual是在執行階段保證物件唯一性的。

2.vitual函式

虛擬函式的出現,是由於基類的指標可以執行派生類,因此引出了不便,引入vitual函式,來告訴編譯器,出現這種情況時,在執行時動態連結進行處理。

3.vitual在純虛擬函式中使用

純虛擬函式完全是為了繼承體系的完整,也是整合vitual函式的作用而產生的。代表了編譯器階段物件的繫結,將呼叫選擇轉移到執行時動態繫結。

綜上:vitual關鍵的引入,可以理解為阻止編譯階段的靜態繫結,將繫結(虛擬函式)和約束工作(虛基類)轉移到執行時動態處理。

高手進來看看C語言c,求高手解釋下 C語言 C 語言 C 語言的區別?及年代背景?

我修改成c語言的了,並且能編譯通過了,可以執行了只是,執行的結果,對不對,我沒有驗證。include include void data double a,int x,int m,int n break case 25 演算法同上 for y i 2 y i 2 y break a i j sum ...

c中解釋下out和ref的區別,C 中解釋下out和ref的區別?

小膽大俠 ref 要求引數在傳遞給函式前要初始化,out則不需要,常見於平臺呼叫中 糖糖寳寳 out與ref的區別如下 private void button1 click object sender,eventargs e ref public void refvalue ref int refi...

C語言語句解釋,高手請進

先定義一個字元型別的變數,存放字串中的第一個字元,再將第二個字元覆蓋到第一個字元上,依次類推,然後再將你定義的存放第一個字元的字元變數覆蓋到最後一個字元上 s i s i 陣列存放下標以0開始,ch存放s 0 也就是 s 0 for迴圈是將後面的字元覆蓋到前面的字元,再將ch覆蓋到最後一個字元 s是...