2010-07-26 494 views
2

可能重複:
Why pure virtual function is initialized by 0?設置虛擬函數聲明爲零?

在C++中,這是什麼意思設定函數聲明爲零?我猜測它與函數是虛擬的,而不是在這個類中實際定義。發現在我正在閱讀的代碼的頭文件中:

virtual void SetValue(double val)=0; 

這是怎麼回事?

+2

打開你最喜歡的C++書並閱讀純虛函數。通過在論壇上提出一般問題來學習該語言的基礎知識並不是一件有意義的事情。一些信息可以在這裏找到http://en.wikipedia.org/wiki/Virtual_function – AnT 2010-07-26 22:00:01

+0

@Troubadour:FWIW:這個問題是從一個「這甚至是什麼意思」的角度,而這個問題是「給出這個意思,爲什麼它看起來這樣「 – Cogwheel 2010-07-26 22:04:53

+0

@AndreyT在我的辯護中,語法太神祕了,我不知道要查找純虛函數(我已經明白了)。我想說,在論壇上提出這個通用問題對我來說非常有意義。 – ack 2010-07-26 22:30:26

回答

8

這是一個pure virtual function。它使得它必須派生一個類(並實現上述功能)才能使用它。

+0

除了派生類,您還必須在派生類中實現它們。 – bits 2010-07-26 22:01:28

+0

這導致抽象類。 – 2010-07-26 22:18:48

0

這意味着,class是抽象的,並且不能被創建它的對象。它可以用作另一個基地class
純虛擬類也用於c++作爲從java等語言已知的interface,但當然它是不同的。

0

如果你設置了一個虛擬函數來設置,它被稱爲純虛函數。然後你的班級變成了抽象班。 除非您的純虛函數被實現,否則您不能創建該類或任何子類的實例。

1

這意味着它是一個純虛擬方法 - 這意味着子類必須自己實現該方法。該方法仍然可以有一個實現,但具有純虛擬方法的類不能實例化,使得它類似於以其他各種語言顯示的abstract關鍵字。

+1

儘管名稱是一個純虛擬方法可以有一個實現...純虛擬聲明意味着該類是抽象的,並且派生類必須實現該函數是非抽象的。這並不意味着該方法在基類中沒有實現(實際上它可以在基類中有一個實現)。 – 6502 2010-07-26 22:14:03

+0

啊,當然。我的錯。我將編輯我的帖子。 – 2010-07-26 22:21:15

+0

Nit pick:C++有函數,而不是方法。正確的術語是*純虛函數*。 – 2010-07-26 23:53:23

2

這被稱爲純C++語言中的虛擬成員函數。就像你猜測的那樣,它意味着函數沒有在類中定義,而是必須在派生類中實現。您不能使用純虛擬成員函數實例化類,純虛函數的行爲基本上像Java或C#中的抽象方法。

+0

這並不意味着它沒有被定義,只是它必須被覆蓋。它可以有一個定義。 – 2010-07-26 22:32:49

+0

是的,你是對的。 – haffax 2010-07-26 23:21:57

0

方法SetValue是純虛擬的。它的類不提供該方法的實現,也不能實例化(因此我們稱它爲抽象)。另一方面,具體派生類必須爲這些方法提供實現。查看更多here

0

正如大家所提到的,這意味着函數是一個純虛函數。把它看作設置函數指針爲null。具有純虛函數的類作爲抽象類來處理。這意味着派生類必須實現這個虛函數。

偶爾,您可能會遇到所謂的「純粹呼叫」錯誤。這意味着一個純粹的虛擬函數實際上被調用,它很可能會導致程序崩潰。純調用的最常見原因是該函數被調用的對象已被刪除。

0

「SetValue」是基類強制派生類提供的純虛擬成員函數。純虛擬成員函數將沒有實現。

純虛擬成員函數指定成員函數將存在於具體派生類的每個對象上,即使成員函數沒有(通常)在基類中定義。

這是因爲指定純虛擬成員函數的語法強制派生類實現成員函數,如果派生類打算實例化(即如果它們打算具體)。

在你的情況中,從基類派生的類的所有對象都有成員函數SetValue()。但是,因爲基類是一個抽象概念,所以它不包含足夠的信息來實現SetValue()。

想象一下,「= 0」就像是說「該函數的代碼位於空指針。」

純虛擬成員函數允許用戶針對具有幾個功能不同變體的接口編寫代碼。這意味着如果這些對象都在相同的抽象基類的保護下,那麼可以將語義上不同的對象傳遞給函數。