前言;在前面的部落格重寫中提到了虛方法和抽象類,本博文詳細介紹下虛方法:
當有乙個定義在類中的函式需要在繼承類中實現時,可以使用虛方法,虛方法是使用關鍵字virtual
宣告的,虛方法可以在不同的繼承類中有不同的實現,即為基類中定義的允許在派生類中重寫的方法;
一般的宣告形式如下:
訪問修飾符 virtual 函式返回型別 函式名(參數列) ;
舉例:
class
person
}
呼叫上,使用子類構造的物件呼叫虛方法,就會呼叫子類的方法,使用父類構造的物件,就會呼叫父類的方法;(在規則 4 中有舉例說明)1.在基類中宣告的虛方法一般在派生類中對其進行呼叫,會運用到base
關鍵字:當輸入訪問修飾符和override
後,系統會自己彈出我們剛才編寫的虛方法,直接進行選擇即可:
2.在執行時進行呼叫:
1. 虛擬類其實指的是正常類中的虛擬方法,所以虛擬類可以直接使用例項,這是與抽象類不同的一點;
它不會像抽象類一樣進行報錯!!!
2. 虛擬方法是在方法前加virtual關鍵字,對方法進行宣告,說明這個方法為虛方法;
class
person
}class
boy:
person
//繼承person
3. 虛函式和正常函式無區別;4. 子類繼承虛擬類可以實現虛擬方法也可以不實現虛擬方法;
如下**所示,在呼叫虛方法時,對虛方法進行了重寫,這樣**執行下來的就是子類的方法而不是父類的虛方法:::
class
person
}class
boy:
person
public
void
sss()}
class
program
}
結果如圖所示:
但是如果我們採用base
關鍵字進行呼叫的話就會有以下的結果:
public
override
void
***(
)
結果如下:它呼叫了父類/基類的虛方法
5. 虛方法可以在不同的繼承類中有不同的實現;
我們在以上案例中繼續進行新增呼叫虛方法:
classdd:
person
}classss:
person
}
當然別忘記例項化哦,我在這兒就不寫例項化的**了,但是千萬不能忘記哦!!?
執行結果:
一定要注意,只有為虛方法時可以進行重寫,不能對非虛方法進行重寫;
虛方法在形式上在方法名前加virtual
修飾;
虛方法一般在基類定義,在派生類中實現具體操作,派生類實現該方法時,要用override
對其方法進行修飾;
當用virtual
修飾後,不允許再有static
、abstract
或者override
修飾符;
當在基類中進行虛方法的定義以後,在派生類中可以對其方法進行呼叫,而且可以通過重寫來改變其中實現的功能來實現自己的一些功能,而不是虛方法時,必須重新宣告方法然後再進行自己想要的功能進行編寫然後再進行呼叫,但是虛方法只需要在派生類中對其進行呼叫,如果想實現其他的功能可以對其進行方法等的重寫,進而實現自己想要的功能,呼叫基類的虛方法來執行派生類的具體操作。而在基類呼叫時,並不需要知道派生類是怎麼樣實現的。因為不同的派生類可能實現的方式不一樣。但呼叫的方式是一樣的,實現了不同的功能
1.允許 子類 / 派生類 進行重寫;
2.增加**的可維護性,脈絡較清淅有條理;
虛方法virtual詳解
從c 的程式編譯的角度來看,它和其它一般的函式有什麼區別呢?一般函式在編譯時就靜態地編譯到了執行檔案中,其相對位址在程式執行期間是不發生變化的,也就是寫死了的!而虛函式在編譯期間是不被靜態編譯的,它的相對位址是不確定的,它會根據執行時期物件例項來動態判斷要呼叫的函式,其中那個申明時定義的類叫申明類,...
C 中virtual(虛函式)的用法 詳解
在物件導向的c 語言中,虛函式 virtual function 是乙個非常重要的概念。虛函式是指乙個類中你希望過載的成員函式 當你用乙個 基類指標或引用 指向乙個繼承類物件的時候,呼叫乙個虛函式時,實際呼叫的是繼承類的版本。摘自msdn 舉例 include using namespace std...
C 基礎概念 虛方法virtual
在c 中,虛方法就是可以被子類重寫的方法,如果子類重寫了虛方法,則在執行時將執行重寫的邏輯 如果子類沒有重寫虛方法,則在執行時將執行父類的邏輯。虛函式在編譯期間是不被靜態編譯的,它的相對位址是不確定的,它會根據執行時期物件例項來動態判斷要呼叫的函式,其中那個申明時定義的類叫申明類,那個執行時例項化的...