[英]Overriding base class methods
是否有可能像在C#中使用override關鍵字那樣在C ++中重寫基類方法?
請幫忙謝謝
是。
只需將基本方法virtual
。
C ++沒有override
關鍵字。 與virtual
基本方法具有相同簽名(包括參數類型和const
-ness)的任何方法都將覆蓋它。
僅在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派生的,那么還可以,它仍然超速了,不隱藏。 高溫超導
是的,您可以重寫基類方法; 如果您在基類中使用關鍵字virtual
,則該方法的綁定將是動態的(即完全多態的); 如果您在基類中未使用關鍵字virtual
,則該方法的綁定將是靜態的。
很多答案都說您使基類函數成為virtual
,這通常是完成的,但不是必需的。 您可以執行以下操作...
class A{
public:
void foo();
}
class B: public A{
public:
void foo();
}
class C: public A{
public:
void foo();
}
如果您有一個A指針數組,例如A* basePTR[2]
,則可以將basePTR[0]
實例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;
}
foo()
末尾的=0
表示此函數是純虛函數,這意味着它必須由派生類定義,並且您不能創建A
的實例。 在游戲中將使用此位置的一個很好的例子,您可能有一個基類GameToken,該基類具有XYZ位置以及一個純虛函數繪制和更新。 從中可以得出player
AI
dynamicObject
等...然后,您的引擎可以只存儲一個類型為GameToken*
數組,並對該數組中的所有不同類型調用draw()
和update()
進行迭代
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.