2010-10-02 58 views
0

純虛擬對象是否有指向vtbl的指針? (可能指向NULL)純虛擬對象是否有指向vtbl的指針?

謝謝,我有點困惑與所有的虛擬機制。

+3

「純虛擬物體」是一個矛盾。一旦你創建了一個對象,它就不再是純粹的,它是一個真正的類的對象。而且它是虛擬的,你創造了一個真實的物體。像這樣的Monikers適用於一種方法,而不是一類。 – 2010-10-02 21:03:02

+0

@Hans - 有些人會堅持認爲fred *指向fred類型的對象,儘管fred類是純虛擬的。我個人認爲,這個對象與實例化的對象是相同的,不管你如何引用它,而且純虛擬類當然不能被實例化 - 但是我曾經被稱爲傻瓜,因爲它對comp.lang這麼說.C++由一個我相信是在標準化委員會的人。當然,我當時自己很討厭,所以... – Steve314 2010-10-02 21:12:58

+1

Hmya,強調單詞「oxymoron」不應該放在最後一個音節上。談論「純粹的虛擬物體」就像十幾歲的男孩談論性。很多想象力,而不是很多練習。使用「界面」一詞,你會得到一個地方。 – 2010-10-02 21:30:18

回答

3

別擔心。虛擬表是實現細節,甚至不保證存在。你擔心如何做的越多,你就會越少地瞭解實際的語言。


這就是說,是的。然後具體的類會將該指針設置爲指向正確的虛擬表。

0

在技術上並不存在「純虛擬物體」這樣的東西。我假設你的意思是一個純虛擬方法的對象?但是你實際上不能創建這樣的對象,因爲它會是抽象的,編譯器會抱怨。

儘管如此,在構造對象時,它只是在成爲派生類的實例之前的一個抽象類的實例。在這種情況下,將有一個虛擬表設置它定義的功能。純虛擬方法可能會有NULL。如果您嘗試調用該程序將會崩潰。

你可以通過在構造函數中調用虛擬方法來試試。如果您調用基類中的方法,您會發現它們會調用基類版本。如果您調用純虛擬方法,它會崩潰。 (在某些情況下,編譯器會找出你在做什麼,而不是抱怨)。

的帶回家的是:

不要調用虛函數在構造函數,它只是有可能會造成混亂。事實上,在大多數情況下,如果你的構造函數只是設置其內部狀態並且沒有做太複雜的事情,那麼最好。

+0

「_對於純虛擬方法可能會有NULL。」通常情況下不會:只有在這種情況下才會在控制檯上打印「純虛擬調用」的函數,然後中止。但人們必須記住,行爲沒有定義,所以在這裏沒有保證。 – curiousguy 2012-08-09 01:30:55

相關問題