回答
不能覆蓋的成員函數沒有它。
你只能隱藏其中之一。
struct Base {
void foo() {}
};
struct Derived : Base {
void foo() {}
};
Derived::foo
不不覆蓋Base::foo
;它只是隱藏它,因爲它具有相同的名稱,如下列:
Derived d;
d.foo();
調用Derived::foo
。
virtual
使多態性,這樣你實際上覆蓋功能:
struct Base {
virtual void foo() {}
};
struct Derived : Base {
virtual void foo() {} // * second `virtual` is optional, but clearest
};
Derived d;
Base& b = d;
b.foo();
這將調用Derived::foo
,因爲這個現在覆蓋Base::foo
—你的對象是多態的。
(您也有使用引用或指針對於這一點,由於the slicing problem。)
Derived::foo
不需要重複virtual
關鍵字,因爲Base::foo
已經使用它。這是由標準保證的,你可以依靠它。但是,有些人認爲最好保持清晰。
我知道虛擬是必要的,當聲明方法可以被覆蓋。我在重寫方法時詢問了有關使用此關鍵字的問題,而不是聲明。 – kravemir
@Miro:我沒有關注。通過聲明另一個覆蓋它的函數來覆蓋函數。無論如何,至少我的最後一段會回答你的問題。 –
A virtual
在基類中的方法將級聯通過層次結構,使每個具有相同簽名的子類方法也是virtual
。
class Base{
public:
virtual void foo(){}
};
class Derived1 : public Base{
public:
virtual void foo(){} // fine, but 'virtual' is no needed
};
class Derived2 : public Base{
public:
void foo(){} // also fine, implicitly 'virtual'
};
儘管如果僅用於文檔目的,我會推薦編寫virtual
。
當一個函數是虛擬的時候,它在整個層次結構中保持虛擬,無論你是否每次明確地指定它是虛擬的。覆蓋方法時,使用虛擬爲了更加明確的 - 沒有其他的區別:)
class A
{
virtual void f()
{
/*...*/
};
};
class B:public A;
{
virtual void f() //same as just void f()
{
/*...*/
};
};
- 1. 調用MethodInfo.MakeGenericMethod時,這個關鍵錯誤意味着什麼?
- 2. C#:如何構造這個方法,這意味着被覆蓋
- 3. 烘焙方法意味着什麼?
- 4. T-SQL:AS關鍵字在這種情況下意味着什麼?
- 5. 'fileprivate'關鍵字在Swift中意味着什麼?
- 6. 在這種情況下,extends關鍵字意味着什麼?
- 7. 什麼是「自我」關鍵字意味着WebWorkers
- 8. 一個時期在方法的聲明中意味着什麼?
- 9. 多重條件覆蓋是否意味着分支覆蓋?
- 10. 什麼是..和*意味着方面j
- 11. void **意味着什麼
- 12. PREEMPTIVE_XE_DISPATCHER這意味着什麼?
- 13. Field.Index.NOT_ANALYZED_NO_NORMS意味着什麼
- 14. HttpServletResponse.SC_BAD_REQUEST意味着什麼?
- 15. 什麼呢##意味着在$ {}
- 16. Solr意味着什麼?
- 17. 溢出意味着什麼?
- 18. 什麼===在PHP意味着
- 19. * | *這意味着什麼CSS?
- 20. 什麼<?意味着
- 21. 什麼。意味着在PHP?
- 22. %是什麼〜DP0意味着
- 23. 什麼-Dauto意味着
- 24. 什麼%*%意味着R中
- 25. AccountExpirationDate意味着什麼?
- 26. 這是&意味着什麼?
- 27. 什麼?意味着iOS的
- 28. $這意味着什麼PHP?
- 29. 什麼呢JDBC:HSQLDB:hsqlTempFiles意味着
- 30. 奎因意味着什麼?
[C++ Virtual/Pure Virtual Explained]的可能重複(http://stackoverflow.com/questions/1306778/c-virtual-pure-virtual-explained) –
@Harald:Nope。不同的主題。 – Xeo
但我在問關於那個關鍵字的用法。不是關於抽象的虛擬方法。 – kravemir