C++ Virtual函式
虛擬函式是C++中用於多型的機制。核心理念就是通過基類訪問派生類定義的函式。
基類的析構含糊都必須是virtual的
虛擬函式只能藉助於指標或者引用來達到多型的效果。
前提B類繼承與A類 且foo()為虛擬函式
void bar(A *a)
{
a->foo();//被呼叫的是A::foo()還是B::foo() ?
}
如果a指向的是A類的例項,則A::foo()被呼叫,如果a指向的是B類例項,則指向
B::foo();
在設計一個基類的時候,如果發現一個函式需要在派生類裡有不同的表現,那麼它就應該是虛的。
從設計角度講,出現在基類中的虛擬函式是介面,出現在派生類中的虛擬函式是介面的具體實現。通過
這樣的方法,就可以將物件的行為抽象化。
虛擬函式總是在派生類中被改寫,這種改寫被稱為“override”。
override是指派生類重寫基類的虛擬函式。重寫的函式必須有一致的參數列和返回值(允許返回值不同)
純虛擬函式不需要定義其實際操作,它的存在只是為了在派生類中被重新定義,只是為了提供一個多型介面。
只有擁有純虛擬函式的類,就是一種抽象類,它是不能被例項化的。
virtual void foo()=0; //標誌一個虛擬函式為純虛擬函式 (=0)
補充:如果類B繼承了A之後,A是抽象類,如果類B沒有改寫A中的純虛擬函式,那麼B本身也就成為一個擁有純虛擬函式
的類,也就變成抽象類了。
行內函數,建構函式,靜態成員函式為什麼不能為virtual函式?
重點虛擬函式是執行期間確定的
1 > 行內函數
行內函數是在編譯時期展開,而虛擬函式的特性是執行時才動態聯編,所以兩者矛盾,不能定義行內函數為虛擬函式
2 > 建構函式
建構函式用來建立一個新的物件,而虛擬函式的執行是建立在物件的基礎上,在建構函式執行時,物件尚未形成,所以不能將建構函式定義為虛擬函式
3 > 靜態成員函式
靜態成員函式屬於一個類而非某一物件,沒有this指標,它無法進行物件的判別
相關文章
- C++中的虛擬函式(virtual function)C++函式Function
- 【C++基礎】純虛擬函式 - pure virtual functionC++函式Function
- C++繼承三之純虛擬函式pure virtual functionC++繼承函式Function
- 驗證virtual函式的原理函式
- [CareerCup] 13.3 Virtual Functions 虛擬函式Function函式
- [CareerCup] 13.6 Virtual Destructor 虛解構函式Struct函式
- C++函式C++函式
- 【C++】函式C++函式
- 內聯(inline)函式與虛擬函式(virtual)的討論inline函式
- C++ Virtual詳解C++
- c++ Beep函式C++函式
- c++函式模板C++函式
- C++仿函式C++函式
- C++ 建構函式和解構函式C++函式
- C++的函式和模板函式 (轉)C++函式
- C++的函式式革命C++函式
- C/C++—— C++中函式重寫和函式過載C++函式
- C++之Virtual初探(一)C++
- C++中函式指標與函式物件C++函式指標物件
- C++ 類建構函式和解構函式C++函式
- c++中訊息函式 -- GetMessage函式C++函式
- C++ replace() 函式用法C++函式
- C++中strlen函式C++函式
- C++解構函式C++函式
- C++函式過載C++函式
- c++ 函式指標C++函式指標
- C++之memset函式C++函式
- C++ 序列操作函式C++函式
- 【C++】建構函式C++函式
- C++ 虛擬函式C++函式
- C++建構函式C++函式
- C++ -- TranslateMessage函式C++函式
- C++虛擬函式C++函式
- C++筆記--函式C++筆記函式
- 函式回撥(C++)函式C++
- c++的remove函式C++REM函式
- C++(函式指標)C++函式指標
- C++靜態函式C++函式