2016-11-21 8 views
0

私は2つのクラスがあるとします。私はを目指ししようとしています何進化したクラスをシミュレートするための最良のプログラミング方法は何ですか?

class SwordsMan{ 
    /*...*/ 
    virtual SwordsMan* evolve() 
}; 

class Warrior: public SwordsMan{ 
    /*...*/ 
}; 

は、彼は十分な経験を持っていたら、剣士が戦士に進化ということです。一度彼が進化した "この" SwordsManオブジェクトを削除したい場合、このevolve()関数を実装するためのベストプラクティスは何でしょうか?

+1

「剣士」が「戦士」に進化する方法に完全に依存します。 Btw私は二度と、相続が正しい方法であると思うでしょう。たぶん「戦士」は「剣士」が持つことができるタイトルなのかもしれません – user463035818

+0

私が間違っていると私を訂正しますが、戦士には通常の剣士が持たない追加の能力と特性があるので(剣士の能力)、継承が行く方法でしょう。また、なぜダウン投票? – AspiringMat

答えて

2

通常、オブジェクトの実装をその存続期間の管理から切り離す方が良い考えです。上記のクラス1層で

class SwordsMan { 
    virtual std::unique_ptr<SwordsMan> evolve(); 
}; 

class Warrior: public SwordsMan { }; 

、コードは次のようになります。

auto swordsMan = std::make_unique<SwordsMan>(); // Get a swordsman 

if(auto evolved = swordsMan->evolve()) // Ask him to evolve 
    swordsMan = std::move(evolved); // Replace him 

あなたは間違いなく剣士をアップグレードしたいときにだけevolve()を呼び出す場合は、ifをドロップすることができます。

swordsMan = swordsMan->evolve(); 
+0

ありがとう、それは私が探していたものです!これが継承の許容される使用法であることに同意しますか? WarriorにはSwordsManの能力と特性があり、Swordsmanにはない追加の能力があるという事実を考えてください。 – AspiringMat

+1

@ user3508551私にはうまく聞こえます:) – Quentin

関連する問題