2011-08-22 64 views
2

除繼承之外,還有什麼其他原因需要類具有虛擬功能?cpp繼承問題

運行時發生什麼情況,其中繼承基類並且派生類沒有實現少量的基類函數,而第三個類調用未定義的方法,這些未定義的方法被定義爲基於虛擬的。 seg fault還是會調用基類函數?

如果我不想在我的派生類中的基類中定義所有的函數,但仍然有必要的繼承,我該怎麼辦?

回答

3

除了繼承之外,還有什麼其他的原因需要類具有 作爲虛函數?

如果您沒有處理繼承問題,則沒有合理的用法來使用virtual函數。兩者都是爲了彼此。

其中一個基類繼承和 派生類沒有實現一些基類的功能和 第三類在運行時會發生什麼調用它們在基礎定義爲虛擬 未定義的方法。 seg fault還是會調用基類函數?

如果派生類不做出關於virtual功能的任何聲明在它的身上的話,那麼(立即)基類virtual函數調用派生類對象。另一方面,如果你只是在派生類中聲明virtual函數,但不定義它,那麼這是一個鏈接器錯誤。沒有分段錯誤。

,我應該怎麼做,如果我不想定義我的派生類在我 基類中的所有功能,但仍然有到位的必要 繼承?

雖然這是不明確的,我會說,你根本就沒有申報/定義在派生類中virtual功能(你不想要的)。它將使用基類virtual函數。

+0

關於你回答的最後一個問題,如果它們只是內部執行的函數,那麼使它們變爲私有將阻止它們繼承對嗎? – Rhexis

+0

@Flyphe,no。訪問說明符不能禁止被繼承的函數(即覆蓋)。你仍然可以覆蓋它。如果函數被調用(在派生類對象中),那麼它仍然可以解析爲重寫函數。 [見演示](http://www.ideone.com/3XmWL)。 – iammilind

+0

所以私有變量和函數可以繼承?那麼保護的意義是什麼? – Rhexis

0

如果您沒有重新實現virtual方法,調用者將調用基類。這是使用繼承IMO的一點。

如果你不想要一個基類來實現虛擬方法,你可以像這樣把它聲明:

class Demo { 
    void foo() = 0; 
}; 

這就是所謂的抽象類。 請注意,您無法創建此類的實例。從Demo繼承的任何類必須實現foo(),否則它也將是一個抽象類,並且因此不可實例化。