第13章 クラス :仮想関数と継承
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
第10章でクラスを学び、第11章では特殊なメンバ関数を深く掘り下げた。 第12章ではスマートポインタの使い方も学んだ。 この章では、これらの構成要素を組み合わせてより優れた取引ゲームを作る。
クラスの階層構造を作れる:抽象的な概念から具体的なタイプへとクラスを関連付ける方法だ。
そうすれば関連するクラスで振る舞いを変えられる。
Stockクラスは価格取得に一つのメソッドを使うが、他の手法も見てきた。
この章では、異なる戦略で資産価格を算出する関連クラスを提供する方法を示す。階層で関連付けられた異なるクラスを使って振る舞いを変えること——タイプのファミリー——をオブジェクト指向プログラミング(OOP)と呼ぶ。
既存のコードベースで階層化されたクラス群を扱う場合、関連クラスを簡単に追加して振る舞いを変更できる。例えばアプリに新機能を追加する時だ。
関連クラスがなければ、振る舞いを変更するために大量のif文やelse文を含む巨大な関数が必要になる。
新機能の追加にはさらにif文や else文が増え、理解困難な巨大な関数が残されることになる。
OOPは新機能を追加する(比較的)簡単な方法を提供する。
一般的なAssetクラスから特定のStockクラスを作成する方法を示す。これで新しい取引ゲームに使えるようになる。
次に「別の派生型を追加する」で別のクラスを作成し、ゲームコード自体を変更せずにゲームの遊び方を変えられるようになる。
また、static_assertや例外処理など、既知のC++機能を復習する機会も得られる。
基底クラスと派生クラス
階層構造は関連するクラスをレベル別に整理する。 最適な構成では、抽象クラスを他のクラスの基底として用いる。 抽象クラスとは、一部の関数を宣言するが実装しないクラスを指す。 抽象クラスはインタフェースを提供する。つまり関連クラスで可能な操作の説明である。
抽象クラスへの参照やポインタは持つことができるが、インスタンスを作成することはできない。 他のクラスは基底クラスから派生できるため、代わりに派生クラスを参照したりポインタを向けることになる。 派生クラスは基底クラスの未実装関数を独自に実装するため、振る舞いを変化させられる。 これは有用だ。なぜなら、詳細を気にせずインタフェース(基底クラス)に対してプログラミングでき、インタフェースを使用するコードを変更せずに、振る舞いを変化させる新たな派生クラスを追加できるからだ。
抽象基底クラスの定義
まず基底クラスから始めよう。。後で他のクラスを派生させる方法を見る。
派生クラスでメンバー関数を別の方法で再実装できることを示すには、キーワードvirtualを使う。
実装を提供せず、基底クラスに= 0を追加することもできる。
このメンバー関数は純粋仮想関数と呼ばれる:実装を持たない関数だ。
基底クラスは抽象クラスとなる:インスタンスを作成できない。
新しいファイル「asset.h」を作成する。
元のStockクラスにはget_nameとnext_price関数がある。
より一般的な資産クラスでは、これらの関数両方が必要になる。
現在の価格を返す別の関数があると便利かもしれない。
stock_prices名前空間内に、3つの抽象仮想関数を持つAssetという新クラスを追加せよ。 仮想デストラクタも提供する必要がある。その理由は ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access