抽象クラスの使いどころが解りません。
「派生クラスでオーバーライドしなければならない関数を含むクラスなんて最初から宣言する必要なくないか?」
「親クラスでわざわざインスタンス化・コンパイルできない制約を付けてまで宣言しなくても普通にpublic継承して、関数を書けばいいだけなのでは・・・・?」
とこのように思っており、便利な使い方、使いどころが思い浮かびません。
なんの為に存在するのでしょうか・・・・・?
参考書を読んでも便利な使い方というより、ただ説明しているみたいな感じで全然便利だと感じません。
便利な使い方があるのでしょうか・・・・?ご指導お願い致します。
抽象クラスの使いどころが解りません
Re: 抽象クラスの使いどころが解りません
>派生クラスでオーバーライドしなければならない関数を含むクラス
これは見方を変えれば「間違いなくその関数が存在している」という事になります。
これは結果的に派生クラスのポインタを抽象クラスのポインタとして扱う事ができます。
例えば抽象クラスのポインタの配列を作り、そこに複数の異なる派生クラスをすべて抽象クラスの方として挿入したりできます。
これは見方を変えれば「間違いなくその関数が存在している」という事になります。
これは結果的に派生クラスのポインタを抽象クラスのポインタとして扱う事ができます。
例えば抽象クラスのポインタの配列を作り、そこに複数の異なる派生クラスをすべて抽象クラスの方として挿入したりできます。
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
糸冬
――――――――
制作・著作 NHK
――――――――
制作・著作 NHK
Re: 抽象クラスの使いどころが解りません
新月獅子さんのおっしゃった通り派生クラスのポインタを纏めて扱ったりするときにはとても便利です。
リスト構造やシーン管理なんかで使われますね。
ほかにもファクトリーパターンなどで検索するといいかもしれません。
リスト構造やシーン管理なんかで使われますね。
ほかにもファクトリーパターンなどで検索するといいかもしれません。
Re: 抽象クラスの使いどころが解りません
taketoshiさんの疑問は、「なぜ Java にはインターフェースなるものがあるのだ?」ということと一緒かもしれません。
C++にはインターフェースという特別な名前のついた機能はありませんが、すべての関数が純粋仮想関数(virtual かつ =0)であるようなクラスは Java のインターフェースとほぼ同じ意味になります。
ということで、実装とインターフェースの分離、というお話を勉強したらいいのではと思います。
C++にはインターフェースという特別な名前のついた機能はありませんが、すべての関数が純粋仮想関数(virtual かつ =0)であるようなクラスは Java のインターフェースとほぼ同じ意味になります。
ということで、実装とインターフェースの分離、というお話を勉強したらいいのではと思います。
- tk-xleader
- 記事: 158
- 登録日時: 13年前
- 連絡を取る:
Re: 抽象クラスの使いどころが解りません
抽象クラスというのは、具体的なオブジェクトの鋳型としては不十分な概念をクラスとして表すのに使われるものです。
たとえば、自動車に表すクラス階層を考えれば、「自動車クラス」があって、その派生型として、「トヨタ::プリウス」などの具体的な車種が存在するわけです。
そうすると、具体的な車種ではない「自動車クラス」は、抽象的すぎてインスタンスを生成するには適しません。そこで、抽象クラスとして記述するわけです。
つまり、プログラム上に、「自動車クラス」のオブジェクトが存在するのがおかしい場合、抽象クラスの場合はインスタンスを生成しようとすればコンパイルエラーになりますから、コンパイルの段階で間違いを修正することができます。これが、抽象クラスを使った場合に「便利な」点です。
たとえば、自動車に表すクラス階層を考えれば、「自動車クラス」があって、その派生型として、「トヨタ::プリウス」などの具体的な車種が存在するわけです。
そうすると、具体的な車種ではない「自動車クラス」は、抽象的すぎてインスタンスを生成するには適しません。そこで、抽象クラスとして記述するわけです。
つまり、プログラム上に、「自動車クラス」のオブジェクトが存在するのがおかしい場合、抽象クラスの場合はインスタンスを生成しようとすればコンパイルエラーになりますから、コンパイルの段階で間違いを修正することができます。これが、抽象クラスを使った場合に「便利な」点です。
Re: 抽象クラスの使いどころが解りません
お返事ありがとうございます。
返信が遅くなって申し訳ありません。
アドバイスいただいてやっと使いどころが見えてきました。
特にトヨタ::プリウスは解り易かったです。
この前、光をデスクトップ上に光を放出するプログラムを書いたのですが
これも光::オレンジ色とか光::赤とか定義しながら書いていけば楽だったのかと感じています。
その時はオレンジ色を基本クラスとして、別の色を読み込む機能を派生させて、
オレンジ::赤、オレンジ::青みたいに使っていました。
そして、親クラスのポインタに突っ込んでループで回していました。
知らず知らずのうちに少しだけ使っていたみたいです。
教えていただいたおかげで使いどころが明確になりました、ありがとうございます。
返信が遅くなって申し訳ありません。
アドバイスいただいてやっと使いどころが見えてきました。
特にトヨタ::プリウスは解り易かったです。
この前、光をデスクトップ上に光を放出するプログラムを書いたのですが
これも光::オレンジ色とか光::赤とか定義しながら書いていけば楽だったのかと感じています。
その時はオレンジ色を基本クラスとして、別の色を読み込む機能を派生させて、
オレンジ::赤、オレンジ::青みたいに使っていました。
そして、親クラスのポインタに突っ込んでループで回していました。
知らず知らずのうちに少しだけ使っていたみたいです。
教えていただいたおかげで使いどころが明確になりました、ありがとうございます。