我有類Foo
和Bar
,其中Bar從Foo繼承。這兩個類都有一個getLength()
方法。我有一個主函數,它以超類Foo
對象作爲參數,但它通常會傳遞一個Bar
對象。調用子類的方法
當Bar
對象被傳遞時,爲什麼它仍然調用Foo
getLength()
方法?
我有類Foo
和Bar
,其中Bar從Foo繼承。這兩個類都有一個getLength()
方法。我有一個主函數,它以超類Foo
對象作爲參數,但它通常會傳遞一個Bar
對象。調用子類的方法
當Bar
對象被傳遞時,爲什麼它仍然調用Foo
getLength()
方法?
對不起,如果這是一個愚蠢的問題,但你把getLength()函數標記爲「虛擬」? (您需要)
如果子類可能會覆蓋它,您應該將您的方法定義爲virtual
。
您需要在基類中聲明方法virtual
。
請記住,任何虛擬方法的類也應該有一個虛擬析構函數。
此信息充沛:http://www.parashift.com/c++-faq-lite/virtual-functions.html
您需要聲明的方法虛擬。
class Foo
{
virtual double getLength();
}
當然,每個人都是對的,因爲您需要將該功能標記爲虛擬。但爲什麼會這樣呢?
在C++中,非虛函數調用在編譯時使用類型的參考來解析,而不是實際的對象類型。所以這就是爲什麼在你的情況下,Foo :: getLength()函數被稱爲—你的函數被聲明爲使用Foo。
但是,如果將函數聲明爲虛函數,那麼對象的實際類型將決定調用哪個函數。
閱讀virtual functions section of the C++ FAQ瞭解所有血淋淋的細節。
(對比度這種情況下,以Java等語言,其中實例方法是通過默認虛擬)
您必須聲明Foo的的getLength()函數爲虛擬的。請通過下面的鏈接來獲得有關虛擬功能,隱藏虛擬化,虛擬桌面等的說明。
當然還有面試問題的一個被宣佈爲const而另一個不是!
getLength()聲明中需要「虛擬」關鍵字。並且想起在每個類中創建虛擬析構函數來正確釋放資源。因爲如果您使用指向派生的基類的指針並調用非虛析構函數,則只會調用基類析構函數。如果添加虛擬析構函數,那麼將首先調用派生類析構函數,然後調用基類析構函數。當您在派生類中獲取額外的資源並需要首先釋放它時,它是有用的。基類析構函數不能生成它,因爲它不知道額外的資源。
getLength()在你的Foo類中聲明瞭`virtual`嗎? – RageD 2011-02-01 02:24:59
發佈您的代碼。 – 2011-02-01 02:25:06