抽象クラスの使いどころが解りません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
taketoshi
記事: 221
登録日時: 9年前
住所: 日本国

抽象クラスの使いどころが解りません

#1

投稿記事 by taketoshi » 8年前

抽象クラスの使いどころが解りません。
「派生クラスでオーバーライドしなければならない関数を含むクラスなんて最初から宣言する必要なくないか?」
「親クラスでわざわざインスタンス化・コンパイルできない制約を付けてまで宣言しなくても普通にpublic継承して、関数を書けばいいだけなのでは・・・・?」
とこのように思っており、便利な使い方、使いどころが思い浮かびません。

なんの為に存在するのでしょうか・・・・・?


参考書を読んでも便利な使い方というより、ただ説明しているみたいな感じで全然便利だと感じません。
便利な使い方があるのでしょうか・・・・?ご指導お願い致します。

アバター
nullptr
記事: 239
登録日時: 8年前

Re: 抽象クラスの使いどころが解りません

#2

投稿記事 by nullptr » 8年前

>派生クラスでオーバーライドしなければならない関数を含むクラス

これは見方を変えれば「間違いなくその関数が存在している」という事になります。
これは結果的に派生クラスのポインタを抽象クラスのポインタとして扱う事ができます。

例えば抽象クラスのポインタの配列を作り、そこに複数の異なる派生クラスをすべて抽象クラスの方として挿入したりできます。
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

nil
記事: 428
登録日時: 8年前

Re: 抽象クラスの使いどころが解りません

#3

投稿記事 by nil » 8年前

新月獅子さんのおっしゃった通り派生クラスのポインタを纏めて扱ったりするときにはとても便利です。
リスト構造やシーン管理なんかで使われますね。
ほかにもファクトリーパターンなどで検索するといいかもしれません。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: 抽象クラスの使いどころが解りません

#4

投稿記事 by beatle » 8年前

taketoshiさんの疑問は、「なぜ Java にはインターフェースなるものがあるのだ?」ということと一緒かもしれません。
C++にはインターフェースという特別な名前のついた機能はありませんが、すべての関数が純粋仮想関数(virtual かつ =0)であるようなクラスは Java のインターフェースとほぼ同じ意味になります。

ということで、実装とインターフェースの分離、というお話を勉強したらいいのではと思います。

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

Re: 抽象クラスの使いどころが解りません

#5

投稿記事 by tk-xleader » 8年前

抽象クラスというのは、具体的なオブジェクトの鋳型としては不十分な概念をクラスとして表すのに使われるものです。
たとえば、自動車に表すクラス階層を考えれば、「自動車クラス」があって、その派生型として、「トヨタ::プリウス」などの具体的な車種が存在するわけです。
そうすると、具体的な車種ではない「自動車クラス」は、抽象的すぎてインスタンスを生成するには適しません。そこで、抽象クラスとして記述するわけです。

つまり、プログラム上に、「自動車クラス」のオブジェクトが存在するのがおかしい場合、抽象クラスの場合はインスタンスを生成しようとすればコンパイルエラーになりますから、コンパイルの段階で間違いを修正することができます。これが、抽象クラスを使った場合に「便利な」点です。

taketoshi
記事: 221
登録日時: 9年前
住所: 日本国

Re: 抽象クラスの使いどころが解りません

#6

投稿記事 by taketoshi » 8年前

お返事ありがとうございます。
返信が遅くなって申し訳ありません。

アドバイスいただいてやっと使いどころが見えてきました。
特にトヨタ::プリウスは解り易かったです。

この前、光をデスクトップ上に光を放出するプログラムを書いたのですが
これも光::オレンジ色とか光::赤とか定義しながら書いていけば楽だったのかと感じています。

その時はオレンジ色を基本クラスとして、別の色を読み込む機能を派生させて、
オレンジ::赤、オレンジ::青みたいに使っていました。
そして、親クラスのポインタに突っ込んでループで回していました。
知らず知らずのうちに少しだけ使っていたみたいです。

教えていただいたおかげで使いどころが明確になりました、ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る