cocos2d-x:オーバーライドを学んだ

間違った思い込み

継承について曖昧知識しかないため、間違った思い込みをして遠回りしてしまいました(今も正しく理解できているのか不安ですが…)。今週、やっと継承を利用した構成で通常砲塔とレーザー砲塔を作成できました。
弾幕の器の攻略動画のリリースが完了したら、続編の進捗動画をリリースするようにしたいと思います。
 

基底クラスから派生クラスのメソッドを実行したい

基底クラスと派生クラスを利用しての弾幕ゲーム作成を進めているのですが、いきなり躓きました。基底クラスから派生クラスのメソッドの実行方法が分かりません。起動時間の処理はすべての砲塔に共通なので基底クラスに記述。攻撃方法は砲塔毎に異なるので派生クラスに記述。
————————————
・基底クラス:起動時間が終わったので攻撃開始
   ↓
   ↓どうやって実行するの?
   ↓
・派生クラス:攻撃開始の処理
————————————
派生クラス毎にキャストすれば実行できるのですが、そもそもが派生クラス毎にキャストしたくないから基底クラス/派生クラスを学び始めたのです。なのでキャストして利用するのは多分間違いだと思う。
 

テンプレートっぽい?

クラスに疎いので検索キーワードも良く分からず時間がかかってしまいましたが、オーバーライドという仕組みを利用することが分かりました。ポイントは派生クラスで利用するメソッドも基底クラスで定義しておく点です。基底クラスで定義したメソッドを派生クラスで上書きするからオーバーライドというらしいです(たぶん)。
 
これに利用するのがvirtual指定子です。基底クラスで「仮」に設定しておくから「virtual」なのかな。以下のサイトが参考になりました。必ず上書きが必要な場合は純粋仮想関数を使うと良いのだそうです。
→参考:ロベール先生:仮想関数
→参考:オーバーライドと仮想関数
 

メモリの解放

私の勘違いは、派生クラスを作成すると基底クラスのオブジェクトが作成され、それを派生クラスのオブジェクトが内包している(つまり2つのオブジェクトが存在している)というものでした。ですが実際は1つで基底クラスをベースにした派生クラスのオブジェクトが1つだけ作成されているのです(たぶん)。
 
Cocos2d-xではautoreleaseメソッドを利用することでメモリ管理を「おまかせ」にすることができます。砲塔作成に利用している基底クラスは単独では利用しないので、派生クラスにだけautoreleaseメソッドを利用すれば良いハズ。それでメモリリークしなければ私の理解で正しいような気がする(たぶん)。
 
 
 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


四 × = 8


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>