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指標,它無法進行物件的判別
相關文章
- 內聯(inline)函式與虛擬函式(virtual)的討論inline函式
- C++函式C++函式
- c++ Beep函式C++函式
- c++函式模板C++函式
- C++ 建構函式和解構函式C++函式
- C++中函式指標與函式物件C++函式指標物件
- C++函式模板案例C++函式
- C++靜態函式C++函式
- C++(函式指標)C++函式指標
- 函式回撥(C++)函式C++
- c++的remove函式C++REM函式
- C++之memset函式C++函式
- C++ 序列操作函式C++函式
- C++解構函式C++函式
- C++函式過載C++函式
- C++ replace() 函式用法C++函式
- C++中strlen函式C++函式
- c++ 函式指標C++函式指標
- fill函式與memset函式的區別(c++)函式C++
- C++ 逆向之 move 函式C++函式
- c++中內建函式C++函式
- C++ 類成員函式C++函式
- C++(常量成員函式)C++函式
- c++內建函式物件C++函式物件
- C++逐字輸出函式C++函式
- C++之函式過載C++函式
- C++回撥函式 用法C++函式
- C++ 函式 realloc 的用法C++函式
- c++虛擬函式表C++函式
- c++ const 成員函式C++函式
- [C++] 成員函式指標和函式指標C++函式指標
- C++入門記-建構函式和解構函式C++函式
- 深入C++成員函式及虛擬函式表C++函式
- C++ lambda 表示式與「函式物件」(functor)C++函式物件
- C++ 返回函式指標的函式C++函式指標
- __cxa_pure_virtual報錯(g++編譯虛擬函式時)編譯函式
- C++行內函數、函式過載與函式預設引數C++函數函式
- C++中的回撥函式C++函式
- C++ 虛擬函式表解析C++函式