C (筆記)虛方法

2021-07-30 22:26:50 字數 1584 閱讀 9659

1.可在任何方法上新增virtual,例:virtual void play();

2.繼承性:一旦基類中為虛函式,子類將不會為非虛函式

3.優缺性:宣告虛方法除了使程式慢一點點以外,沒有任何缺點

因為當我們使用基類的引用或指標呼叫基類中定義的某個函式時,我們並不知道該函式真正的物件是什麼型別(屬於哪個類),因為它可能是乙個基類的物件,也可能是乙個子類的物件

#include 

using

namespace

std;

class base

virtual

int get()

private:

int x;

};class derived:public base

int get()

private:

int y;

};int main()

由以上**可以看出,在基類亦或是子類中都有get的方法

若基類中沒有virtual宣告,其結果為

若基類中含有virtual宣告,其結果為

可以看出,若不呼叫虛方法,編譯器在編譯的時候a是base類的指標,所以編譯器就認為a指標呼叫的方法是base類裡的方法,因為這樣的執行效率是最快的,原理也就是對非虛函式的呼叫在編譯的時候進行了繫結,這和通過物件(不是指標或引用)進行的函式呼叫也在編譯是繫結一樣

但是若通過指標或引用呼叫虛方法時,就會在執行時解析該呼叫,即在編譯時是base類的指標,但在執行時才確定是指向derived的方法的,也只有這種情況下,物件的動態型別才有可能與靜態型別不同

乙個子類的函式如果覆蓋了某個繼承而來的虛函式,則形參型別與基類中被覆蓋的方法要完全一樣(包括返回型別),若虛函式的返回型別是類本身的指標或引用時,它們的返回型別可以不匹配

錯誤提示

1.若拿不準要不要使某個方法為虛方法,就宣告為虛方法,優缺點前面已經說了,出來使程式慢一點點以外沒有其他缺點

2.最好在基類裡把所有方法都宣告為虛方法

3.在實現乙個多層次的類繼承關係時,最頂級的基類應該只要虛方法

4.所以析構器都是虛方法,從編譯的角度看,它只是普通方法,但如果不是虛方法,編譯器會繫結編譯時的版本,這樣可能會多次析構基類裡的成員,這對於析構器來說絕對是不安全的,會導致記憶體洩漏

C 學習筆記 多型(一)虛方法

在面對物件程式設計中,類的三大特性分別為封裝,繼承,多型。其中多型的具體實現,依賴於三個方法,也就是虛方法,抽象類和介面。多型的具體作用是什麼呢?或者說多型的存在有什麼意義呢?多型的存在有效的降低了程式的耦合度,在使用的時候,不僅可以表現大家都有的共性,還能在必要的時候突出一些特殊的的個性。那麼如何...

C 虛方法 抽象方法

首先在c 中虛方法的定義 public virtual void virtualmethod 只要在方法名前加上virtual,就宣告了該方法為虛方法,注意宣告為虛方法後再不能加上abstract,static關鍵字宣告 以下是插入乙個例項來說明虛方法與非虛方法的不同 public class a ...

C 初識虛方法

先學習方法替換 using system namespace 方法替換 public class student person class mainclass 在使用方法替換並且例項化物件的時候定義物件的類是不同的,要麼是子類,要麼是父類。虛方法 虛方法簡單說就是讓父類中定義的乙個方法 virtua...