簡體   English   中英

覆蓋基類方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM