2013-05-10 45 views
1

說我有以下類:C++虛方法:最好的方式來使用基本實現,並加

class Airplane 
{ 
    virtual bool Fly(uint64_t destinationID) 
    { 
     //Do what an airplane does to be flown. 
    } 

    /* 
    * More function and data members. 
    */ 
} 

class SomeModel: public Airplane 
{ 
    virtual bool Fly(uint64_t destinationID); 
    { 
     //Do something that SomeModel specifically should do before it gets flying. 

     //Do exactly what Airplane::Fly does. 
    } 
}  

我的問題是如何實現SomeModel ::飛。一個簡單的方法如下:

virtual bool SomeModel::Fly(uint64_t destinationID) 
{ 
    //Do something that SomeModel specifically should do before it gets flying. 

    Airplane::Fly(destinationID); 
} 

有沒有更好的方法呢?或者還有另一種選擇另一種方式的原因。我知道這是一個普遍的問題,但這是我第一次實施這樣的方法,所以我想確保我不會錯過任何東西。

編輯

我覺得很值得強調的是,飛機是不是一般的或抽象類,許多飛機在該公司只是飛機和出現這樣沒有任何inhritance,有雖然是一個特定的模式有一些特定的行爲。

+1

方式顯示是正確的方式來做到這一點。你不喜歡它什麼? – Angew 2013-05-10 11:47:24

+0

我只是不確定這是否因爲我從未遇到類似的事情。 – Subway 2013-05-10 11:50:24

+0

您可能想要了解Design Patterns,特別是Template Method模式(不要與C++函數模板混淆)。 – 2013-05-10 11:50:36

回答

1

這真的取決於你想達到的目標。你的例子當然是有效的,並且對於一種類型的問題(早期需要一些設置或其他變化)是一種解決方案。

此主題的另一個變體是使用虛擬設置,然後使用常見的「飛行」方法。

所以:

class Airplane 
{ 
    bool Fly(uint64_t destinationID) 
    { 
     SetupForFlight(); 
     // do actual flying stuff 
     ... 
     ... 
    } 

    virtual void SetupForFlight() { // do nothing for standard airplane } 
} 

class Boeing747: public Airplane 
{ 
    ... 
    void SetupForFLight() 
    { 
     ... do stuff that needs to be set up here. 
    } 
    ... 
} 

有與這兩種方法的好處,它可能將取決於你是什麼造型,這是更好。

當然,在Fly的末尾也可以有AfterLanding類型的函數。

只是出於好奇,在那裏,你需要爲他們的64位值這麼多目的地 - 我從來沒有真正考慮過,只是好奇。

編輯:我想我所描述的是一個「模板方法模式」。我不太喜歡這些東西的名字,我只是知道它是如何工作的......

相關問題