c++中的virtual關鍵字主要有這樣幾種使用場景:第一,修飾父類中的函式 ;第二,修飾繼承性。注意:友元函式、建構函式、static靜態函式不能用virtual關鍵字修飾。普通成員函式和析構函式可以用virtual關鍵字修飾。
virtual具有繼承性:父類中定義為virtual的函式在子類中重寫的函式也自動成為虛函式。
一定要注意: 只有子類的虛函式和父類的虛函式定義完全一樣才被認為是虛函式,比如父類後面加了const,如果子類不加的話就是隱藏了,不是覆蓋.
修飾父類中的函式主要分為三種:普通函式、析構函式和純虛函式。
被修飾的函式稱為虛函式, 是c++中多型的一種實現(多說一句,多型分編譯時多型-通過過載實現和執行時多型-通過虛函式實現)。 也就是說用父類的指標或者引用指向其派生類的物件,當使用指標或引用呼叫函式的時候會根據具體的物件型別呼叫對應物件的函式(需要兩個條件:父類的函式用virtual修飾和子類要重寫父類的函式)。下面用乙個例子來說明:
#include
class
father
virtual
void
func2()
class
son:
public father
void
func2()
intmain()
output:
this is father func1
this is son func2
通過上面的例子可以看出,使用virtual修飾的函式會根據實際物件的型別來呼叫,沒有使用virtual修飾的根據指標的型別來呼叫。虛函式最關鍵的特點是「動態聯編」,它可以在執行時判斷指標指向的物件,並自動呼叫相應的函式。
修飾析構函式與上面講到的使用方法和原理相同,虛析構函式在銷毀時會呼叫物件的析構函式,這樣就不會出現像有的資料成員沒有銷毀導致記憶體洩露的問題或者程式直接崩潰。下面也用乙個例子說明:
class
grandfather
~grandfather()
};class
father:public grandfather
~father()
};class
son:public father
~son()
};intmain()
output:
construct grandfather
construct father
construct son
destruct father
destruct grandfather
我們發現沒有呼叫son的析構函式,當將father或者grandfather其中乙個的析構函式修改為virtual後輸出就變為了
construct grandfather
construct father
construct son
destruct son
destruct father
destruct grandfather
純虛函式的定義是在虛函式的後面加乙個=0。定義了純虛函式的類是乙個抽象類。
virtual
void
func()
=0;
純虛函式需要注意這幾點:
1.定義了純虛函式的類不能夠例項化,也就是不能夠建立物件
2.繼承了含有純虛函式的父類的子類如果沒有實現純虛函式也不能夠例項化
假如有這種場景,乙個類繼承兩個或者更多的父類,但是這些父類裡又有一些有共同的父類,會出現什麼情況呢?
class
grandfather
~grandfather()
};class
father1:public grandfather
~father1()
};class
father2:public grandfather
~father2()
};class
son:public father1, father2
~son()
};intmain()
output:
construct grandfather
construct father1
construct grandfather
construct father2
construct son
destruct son
destruct father2
destruct grandfather
destruct father1
destruct grandfather
通過這個例子我們看到建立乙個son會建立兩個grandfather,不符合我們的預期啊,而且還可能會導致程式掛掉。這裡就請virtual出場了,當把father1和father2繼承grandfather修改為virtual繼承(也就是在public前面加乙個virtual)的時候輸出會變成這樣:
output:
construct grandfather
construct father1
construct father2
construct son
destruct son
destruct father2
destruct father1
destruct grandfather
這比較符合我們的預期。 C 開發之 virtual關鍵字 6 8
2.1.1 使用virtual關鍵字修飾屬性語法形式 修飾屬性 public virtual 資料型別 屬性名 2.1.2 使用virtual關鍵字修飾方法語法形式 修飾方法 訪問修飾符 virtual 返回值型別 方法名 2.1.3 說明2.1.3 重寫override例如在父類中有乙個求長方形面...
C 虛函式 virtual關鍵字
當函式被virtual關鍵字修飾時,該函式被稱為虛函式,虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你呼叫乙個虛函式,實際呼叫的是繼承類的版本。虛函式最關鍵的特點是 動態聯編 它可以在執行時判斷指標指向的物件,並正確呼叫物件的函式。而函式的過載可以認為是...
C abstract和virtual關鍵字
abstract 顧名思義表示抽象,可以形容方法和類等。為什麼要使用抽象類,個人理解,在設計乙個父類時,會提供一些共同的方法,而繼承的不同子類往往會有一些自己獨特的方法,而這些方法在父類中沒辦法去統一,也沒必要去實現,所以只做方法宣告而不去實現,表示為抽象函式,用於子類去實現。1.抽象方法時沒有實現...