2013-12-15 92 views
0
class Base 
{ 
    virtual void foo(); 
} 


class Derived : public Base 
{ 
    void foo(); 
} 

它可以嗎? 或者它可以使一些問題? 我認爲它堅持「不要從派生」。覆蓋虛擬功能到非虛擬功能可以嗎?

+1

請用你正在談論的語言(C++ I guess)來標記你的問題。 – Mat

+0

是的,請在C#中標記它會給你以下警告。 「隱藏繼承的成員Base.foo()。要使當前成員重寫該實現,請添加override關鍵字,否則添加新關鍵字。」你可以閱讀它[這裏](http://msdn.microsoft.com/en-us/library/aa691135(v = vs.71).aspx) –

+0

這甚至不可能。該功能仍然是虛擬的,即使你不這樣說。 – EJP

回答

2

一旦你標記基類中的foo()功能virtual它是隱含在派生類virtual,即使你不提關鍵字virtual在它前面。

0

virtual ness是遺傳的。即使你不聲明重寫方法virtual,它也會是虛擬的。

因此,如果您使用Base指針或引用訪問Derived的對象,它將調用Derivedfoo

0

虛擬功能自動繼承。所以即使你不聲明它是虛擬的,它實際上也是虛擬的。

你明確聲明它作爲虛擬是爲了更好的澄清的原因,使任何人讀取這些代碼可以立即明白,這是一個虛函數,而無需檢查基類的聲明。

+0

其標記虛擬保證,它是虛擬的,即使基類具有相同簽名的成員函數是** **不虛。沒有捷徑可以讓你在不瞭解你在做什麼的情況下編寫正確的代碼。 (好吧,新的「override」關鍵字可能會讓懶惰的程序員更輕鬆......) –