2011-05-01 61 views
1

我正在閱讀一些C++文本重新調整純虛函數。正如文中說,純虛函數聲明的形式,例如是:關於C++中純虛函數的問題?

virtual void virtualfunctioname() = 0; 

而且文字解釋說:「由於純虛函數沒有身體,程序員必須添加符號= 0的聲明基類中的純虛函數「。

我試圖刪除= 0;,這意味着我只宣佈virtual void virtualfunctioname();和事情工作正常。

那麼,爲什麼我們需要給虛函數分配一個0呢? 謝謝

回答

2

如果一個類有任何純虛函數,它不能被實例化。此外,它強制任何派生類實現這些功能,否則它們也無法實例化。

所以如果你刪除= 0,你只需要一個普通的基類,它可以被實例化,並且不會在其派生類上強制實現一個接口。如果你實例化一個基類對象(或沒有覆蓋的派生類對象),那麼你只會遇到麻煩,然後嘗試調用它,因爲沒有定義它,所以鏈接器會報錯。

[注意,也有人聲稱「純虛函數沒有身體」是不正確的;你可以爲純虛擬定義一個實現。本課程將仍然是抽象的,但。]

+0

但是該類可能仍然沒有實例化,因爲它被認爲是抽象的。 – 2011-05-01 02:07:18

+0

@ the_drow:你指的是哪種背景?沒有純虛函數的類*可以實例化(假設構造函數/析構函數是公共的)。 – 2011-05-01 02:08:22

+1

我指的是具有正文的純虛函數。類本身仍然是抽象的,派生類將有一個「默認」實現。 – 2011-05-01 02:10:07

0

事情的罰款

我假設你的意思是,代碼編譯和鏈接。但是,您可能尚未在您聲明的基類中爲virtualfunctionname定義實現,因此如果您曾經調用基礎實現,則會出現鏈接器錯誤。

現在事情可能會起作用,因爲您在派生類中提供了一個實現,並使用它來代替。

+0

如果您嘗試從包含虛擬方法的類實例化派生對象,我很肯定你會得到鏈接器錯誤。否則,如果將其轉換到基類,當調用虛函數時會發生什麼? – 2011-05-01 02:06:37

1

如果您沒有將方法聲明爲純虛函數,那麼編譯器會假定它有某個實現。如果你從來沒有實例化包含這些純虛擬類的類(並且抽象類使用正確的術語),那麼你將會很好。但是,如果這樣做,編譯器將接受該代碼爲有效,稍後您將收到鏈接器錯誤。

如果您將方法標記爲純虛擬,則包含它的類將被標記爲抽象,並且編譯器將拒絕嘗試實例化它。

0

當您將函數聲明爲純虛函數時,包含它的類將被稱爲抽象類,並且不會創建任何實例。 再次沒有該類的實例將被創建。該類用於繼承,派生類必須實現此方法。否則會出現編譯錯誤。 謝謝