「仮想関数」の編集履歴(バックアップ)一覧に戻る

仮想関数 - (2012/12/05 (水) 18:06:02) のソース

*純粋仮想関数
**仮想関数
前章で virtual キーワードをつけた関数は 仮想関数 として扱われ
オーバーライドで書き換えることができると学びました。

virtual をつけずにオーバーライドした場合、オブジェクトを扱う「型」の定義に従い、
virtual をつけてオーバーライドした場合は、基底クラスの「型」として扱っても、オーバーライドされた定義が呼び出されます。

Personの自己紹介はオーバーライドされた場合派生クラスの自己紹介を優先するようになっていました。
また、オーバーロードしなくてもPersonでの定義を呼び出すことが可能です。

**純粋仮想関数
仮想関数は何かしらの定義を持ちましたが、
定義を持たない仮想関数を作ることもできます。
これを純粋仮想関数と呼び、以下のように = 0 をつけることで実現します。
 virtual 戻り値型 関数名(引数) = 0;
この純粋仮想関数のみで構成されたクラスを、抽象クラスまたはインターフェースクラスと呼びます。
インターフェースクラスは関数の定義を持っていないため、オブジェクトを作ることができません。
必ず継承し、関数を再定義して使うのです。

機能の宣言のみを持ったインターフェースですが、どのようなメリットがあるかつかみにくいと思います。
多態性の章において、基底クラスのポインタには、その派生クラスであればどんなオブジェクトでも扱うことができると書きました。
インターフェースはクラス階層の土台に位置し、抽象的な宣言のみ行います。
クラス使用者はインターフェースのみ知っていれば機能を使うことができる上
インターフェースから派生した様々なオブジェクトを同じコードで処理することができます。

*問題
**問題1
①「社員」クラスを作り、「働く」という純粋仮想関数を宣言せよ。
②「社員」クラスを継承し「社長」「部長」「営業」クラスを作り、「働く」を定義せよ。
③main関数において、「社長」「部長」「営業」のオブジェクトをそれぞれ作れ。
④「社員」配列を用意して、③で作ったオブジェクトを配列に入れよ。
⑤社員配列をforループで回し、社員全員に「働く」関数を実行させよ。
目安箱バナー