2017-08-28 8 views
0

私は継承に関する質問があります。私の状況は次のとおりです:派生クラスC++のメソッドを使用するスーパークラス

私は時々交換したい2つのクラス(AThisWay、AThatWay)を持っています。彼らはどちらも同じメソッド名を持っていますが、メソッド内では異なることをします。それらのプロパティとメソッドは、他のクラス(B)によって使用されます。 私はATHisWayしか持っていませんでしたが、Bのスーパークラスでしたが、今はAThatWayも持っていて、AThisWayとAThatWayをサブクラスob Bにすることが可能かどうか疑問に思っています。 Bのスーパークラスを時々変更する方法があります。その点でベストプラクティスは何ですか?

ベスト 聖編集: は今、私は(ノートBはAThisWayからのみ派生)このようにそれをやっているが、私はBも時々AThatWayの方法を使用することができるようにしたいです。 AThiswayやAThatWayのように私が持っている物理モデルは違っていて、時々私のモデルをテストするために、時にはこのように、そして時にはその方法で私の計算をやりたいと思っています。私が今見ている最速の方法は、Bのコピーを作成してAThatWayからそれを派生させることですが、それはかなり複雑ではなく、デバッグが容易ではありません。

class AThisWay { 
public: 
    int aNumber 
    void aMethod() { aNumber = 1; } 
} 

class AThatWay { 
public: 
    int aNumber 
    void aMethod() { aNumber = 2; } 
} 

class B: public AThisWay{ 
public: 
    int anOtherNumber 
    void otherMethod() 
     { 
     aMethod(); 
     anOtherNumber = aNumber + 2; 
     } 
} 
+5

クラスB

class AWay { public: virtual void method() = 0; } class AThisWay : public AWay { public: virtual void method() override { /* code A */ } } class AThatWay : public AWay { public: virtual void method() override { /* code B */ } } 

バーチャルクラスとオーバーライドされた関数、および派生クラスへのベースクラスポインタ。 – Ron

+0

"派生クラスへの基本クラスポインタ"は唯一のオプションか、それを構築する際にどのスーパークラスを使用するかをBに指示する方法はありますか?^ BをAから派生させることは賢明ですか?同様に、その場合のクラスBは、そのサブクラスなしでは何もできません。 –

+1

*クラスB *で使用される*インターフェイスA *が必要で、それらの* AXxxXxx *クラスで実装されているように思えます。 (はい、C++は明示的なキーワードがなくてもインターフェイスの概念をうまくサポートします)。 – hyde

答えて

1

私は、あなたが「時間に、スワップ時間」によって何を意味するか、正しくそれを取得しないかもしれないが、あなたがAThisWayAThatWayの共通の基底クラスを作成し、クラスBがそれを経由して使用するようにしましょうべきであると私には思えます彼らの共通基盤。このようにして、これらのクラスから派生する必要はありません。

class B { 
public: 
    B(bool isThat) { 
     if (isThat) aWay = new AThatWay(); 
     else aWay = new AThisWay(); 
    } 

    void bar() { aWay->method(); } 
private: 
    AWay *aWay = nullptr; 
} 

:記事を読むまで(上記の例のようないくつかの細かな詳細無視:動的メモリの解放を、などのスマートポインタを使用する方が良いでしょう)

+0

それはうまくいくかもしれませんが、派生クラスはむしろ私のモデルの拡張版なので、互いに派生したクラスを維持したいと思います。それは理にかなっていますか? –

+0

その構造を維持したい場合は、そうすることができます。構成は、同じことをする別の方法です。全体の状況を知らなくても、最高のものを判断するのは難しいです。トピックとその落とし穴に関する[記事](http://www.cprogramming.com/tutorial/multiple_inheritance.html)があります。 – nothingam

関連する問題