C++ Virtual函式

PengPengBlog發表於2017-04-26

虛擬函式是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指標,它無法進行物件的判別

相關文章