??? 虛函數與抽象函數的區別
我學面向對象也不久了,但對一些基本概念還是有許多理解不到位。最近看了一些
Delphi
的書,整天看到什么
virtual,
與
abstract,
我才真的弄明白了其中的差別:
虛函數是與多態
(
確切的說是運行時多態
)
密不可分的,虛函數就是為多態服務的,如果沒有多態,虛函數就失去了它的價值。而抽象函數是沒有具體實現的函數。表面上很好理解,但到了具體語言就不好理解了:
比如,在
C++
中,抽象函數(也就是純虛函數)是這樣定義的
virtual returnType method()=0,
所以抽象函數就是虛函數(因為聲明為
virtual
)。而在
java
中任何函數都是虛函數(所以就不存在違反里氏代換原則的可能)所以我們看不到
virtual
這個關鍵字。而抽象函數是聲明為
abstract
的也是沒有具體實現的虛函數。而在
Delphi
里面就有兩個關鍵字,
virtual
和
abstract.
分別聲明為虛函數和抽象函數。這抽象方法就不再是虛方法了
.
但是不管怎樣
,
兩者都意味著方法重寫
(override).
也就是說
,
在父類
(
超類
)
中聲明為虛或抽象的方法就是在教你在子類
(
派生類
)
中重寫
(
重新定義
,override)
它
.
。而我們常說的方法重載(
overload
)是在同一個類中進行的,也就是實現靜態
(
編譯期
)
多態性
.