什麼是虛擬函式,什麼是純虛擬函式?為什麼引入虛擬函式和純虛擬函式?
阿新 • • 發佈:2019-01-03
虛擬函式與純虛擬函式 在他們的子類中都可以被重寫。它們的區別是:
(1)純虛擬函式只有定義,沒有實現;而虛擬函式既有定義,也有實現的程式碼。
純虛擬函式一般沒有程式碼實現部分,如
virtual void print() = 0;
而一般虛擬函式必須要有程式碼的實現部分,否則會出現函式未定義的錯誤。
virtual void print()
{ printf("This is virtual function\n"); }
(2)包含純虛擬函式的類不能定義其物件,而包含虛擬函式的則可以。
(1)類裡如果聲明瞭虛擬函式,這個函式是實現的,哪怕是空實現,它的作用就是為了能讓這個函式在它的子類裡面可以被覆蓋,這樣的話,這樣編譯器就可以使用後期繫結來達到多型了。純虛擬函式只是一個介面,是個函式的宣告而已,它要留到子類裡去實現。
(2)虛擬函式在子類裡面也可以不過載的;但純虛擬函式必須在子類去實現,這就像Java的介面一樣。通常把很多函式加上virtual,是一個好的習慣,雖然犧牲了一些效能,但是增加了面向物件的多型性,因為很難預料到父類裡面的這個函式不在子類裡面不去修改它的實現。
(3)虛擬函式的類用於“實作繼承”,繼承介面的同時也繼承了父類的實現。當然大家也可以完成自己的實現。純虛擬函式關注的是介面的統一性,實現由子類完成。
(4)帶純虛擬函式的類叫虛基類,這種基類不能直接生成物件,而只有被繼承,並重寫其虛擬函式後,才能使用。這樣的類也叫抽象類。