覆蓋基類方法
回答
是。
只要使基本方法virtual
。
C++沒有override
關鍵字;任何具有相同簽名(包括參數類型和const
-度)的方法都將作爲基本方法virtual
將覆蓋它。
是的,你可以重寫基類方法;如果在基類中使用關鍵字virtual
,則該方法的綁定將是動態的(即完全多態);如果您在基類中未使用關鍵字virtual
,則該方法的綁定將是靜態的。
它不會被_fully_動態;重載(參數類型)將在編譯時被選中。 – SLaks 2010-11-11 17:22:06
Slaks:真正的dat。 – 2010-11-11 17:36:32
只有在C++ 0x中,即將出現的C++語言的標準。在C++ 03中,這是您隱式重寫的當前C++,也就是說,您不要將重寫方法顯式標記爲重寫方法。但要小心,如果你不小心寫了另一個簽名,但名稱相同,基類函數將被隱藏並且不被覆蓋!
struct X
{
virtual void f() {...};
};
struct Y:X
{
void f() {...} //overrides X::f
};
struct Z:X
{
void f() const {... } //hides X::f!!!
};
可以在功能聲明不同的唯一事情是,如果在基類中的函數返回T1*
(或T1&
)和衍生T2*
類(或T2&
)和T2從T1衍生那麼它的行,它仍然是過度的,而不是隱藏。 HTH
很多答案都說你做了一個基類函數virtual
,這通常是完成但不需要的。你可以只執行下列操作...
class A{
public:
void foo();
}
class B: public A{
public:
void foo();
}
class C: public A{
public:
void foo();
}
如果你有一個指針如A* basePTR[2]
可以將背景basePTR[0]
作爲B
然後basePTR[1]
實例爲C
實例的數組。但如果你想打電話basePTR[0]->foo()
你會打電話給A::foo()
如果定義A
爲
class A{
public:
virtual void foo();
}
然後調用basePTR[0]->foo()
將調用B::foo()
他們是間接使用此功能在運行時的樣子必須完成以查看您是否調用基本函數foo()
或派生類的foo()
,但通常情況下,此功能值得相對較小的性能影響。
您可以定義A
作爲
class A{
public:
virtual void foo() =0;
}
的=0
在foo()
末意味着該函數是純虛函數,這意味着它必須由一個派生類中定義的,您不能做一個A
的實例。一個很好的例子是你會在遊戲中使用它,你可能有一個基類GameToken,它有一個XYZ位置和一個純虛函數的繪製和更新。從這個你可以得到player
AI
dynamicObject
等...您的發動機則可以只存儲GameToken*
類型的一個陣列,通過這個陣列,呼籲所有不同類型的數組中draw()
和update()
迭代
'虛擬'是需要的,因爲C#*中的覆蓋*表示*多態 – 2010-11-11 18:18:24
- 1. 覆蓋基類模板類方法
- 2. Java基類和子類方法覆蓋
- 3. 基本方法覆蓋
- 4. Python:覆蓋基類
- 5. 調用覆蓋方法,超類調用覆蓋方法
- 6. 無法覆蓋基類的方法在派生類
- 7. Ruby覆蓋類方法
- 8. 覆蓋ActiveRecord類的方法
- 9. 覆蓋方法 - 類變量
- 10. 如何覆蓋類方法
- 11. 如何在子類中使用基類覆蓋ToString()方法?
- 12. 覆蓋方法
- 13. 覆蓋方法
- 14. 覆蓋方法
- 15. 覆蓋方法
- 16. 覆蓋'+'方法
- 17. 覆蓋Child類中的ParentModel類方法
- 18. Objective C - 覆蓋基類的方法 - 如何調用子類的方法?
- 19. Java方法覆蓋 - 「方法不會覆蓋超級方法...」
- 20. 從基類覆蓋函數
- 21. 無法覆蓋LocationListener類的方法
- 22. 覆蓋派生類中已覆蓋的方法
- 23. 防止特定的Action方法被基類覆蓋
- 24. 繼承從基類中的覆蓋方法
- 25. 從模板基類中覆蓋方法時的問題
- 26. 當覆蓋vs隱藏基類方法時C#範圍差異
- 27. 在派生類上實現接口或覆蓋基本方法
- 28. c#用基本類型的詞典覆蓋方法
- 29. 覆蓋touchesBegan:錯誤 - 方法不會覆蓋超類中的任何方法
- 30. 覆蓋get方法
你不需要做出基類虛擬。虛擬基類功能允許您正確使用多態。通常情況下,您可以重寫基類函數,但假設您有一組「形狀」對象指針,則可以將該數組的元素實例化爲派生對象,如「方形」或「三角形」像draw()它通常會調用基類的繪製,除非它是虛擬的,那麼它將查看數組實際指向的是什麼類型,並調用派生類的函數 – thecoshman 2010-11-11 17:27:19
@thecoshman:他要求等價於C#的'override'關鍵字(多態),而不是C#的'new'關鍵字(隱藏)。爲此,你需要'虛擬'。 (即使他不明白這個區別) – SLaks 2010-11-11 17:49:34
好吧,如果你仔細看看C#中的關鍵字'override',它在C++中是不需要的,它隱含地暗示了這兩個函數具有相同的簽名。 – thecoshman 2010-11-11 17:57:59