2011-02-01 88 views
1

我有類FooBar,其中Bar從Foo繼承。這兩個類都有一個getLength()方法。我有一個主函數,它以超類Foo對象作爲參數,但它通常會傳遞一個Bar對象。調用子類的方法

Bar對象被傳遞時,爲什麼它仍然調用FoogetLength()方法?

+1

getLength()在你的Foo類中聲明瞭`virtual`嗎? – RageD 2011-02-01 02:24:59

+1

發佈您的代碼。 – 2011-02-01 02:25:06

回答

3

對不起,如果這是一個愚蠢的問題,但你把getLength()函數標記爲「虛擬」? (您需要)

3

如果子類可能會覆蓋它,您應該將您的方法定義爲virtual

1

您需要聲明的方法虛擬

class Foo 
    { 
     virtual double getLength(); 
    } 
1

當然,每個人都是對的,因爲您需要將該功能標記爲虛擬。但爲什麼會這樣呢?

在C++中,非虛函數調用在編譯時使用類型的參考來解析,而不是實際的對象類型。所以這就是爲什麼在你的情況下,Foo :: getLength()函數被稱爲—你的函數被聲明爲使用Foo。

但是,如果將函數聲明爲虛函數,那麼對象的實際類型將決定調用哪個函數。

閱讀virtual functions section of the C++ FAQ瞭解所有血淋淋的細節。

(對比度這種情況下,以Java等語言,其中實例方法是通過默認虛擬)

0

您必須聲明Foo的的getLength()函數爲虛擬的。請通過下面的鏈接來獲得有關虛擬功能,隱藏虛擬化,虛擬桌面等的說明。

0

當然還有面試問題的一個被宣佈爲const而另一個不是!

0

getLength()聲明中需要「虛擬」關鍵字。並且想起在每個類中創建虛擬析構函數來正確釋放資源。因爲如果您使用指向派生的基類的指針並調用非虛析構函數,則只會調用基類析構函數。如果添加虛擬析構函數,那麼將首先調用派生類析構函數,然後調用基類析構函數。當您在派生類中獲取額外的資源並需要首先釋放它時,它是有用的。基類析構函數不能生成它,因爲它不知道額外的資源。