トップ->C++入門

あなたは

人目のC++(C)言語入門受講生です。

C++入門内検索

目次
C++入門〜トップ
C言語入門〜トップ
0. はじめに

1. オブジェクト指向とは?
   1. オブジェクト指向とクラス
   2. 継承
   3. カプセル化
   4. ポリモーフィズム

2. ストリーム
   1. 出力
   2. マニピュレータ
   3. 入力
   4. ファイル
   5. 練習問題1
   6. 文字列
   7. 練習問題2

3. C++の新しい文法
   1. 新しい型bool
   2. デフォルト引数
   3. newとdelete
   4. 参照型
   5. const
   6. 変数の宣言
   7. 例外
   8. オーバーロード
   9. テンプレート関数
   10. 名前空間

4. クラス
   1. クラスとは
   2. クラスの宣言
   3. クラスの実装
   4. コンストラクタとデストラクタ
   5. クラスの使用法
   6. 例題)スタッククラス
   7. テンプレートクラス
   8. 練習問題
   9. 参照型
   10. 代入演算子
   11. コピーコンストラクタ
   12. 構造体
   13. メンバー変数の初期化
   14. 内部クラス
   15. 無名クラス
   16. 無名共用体
   17. 演算子の作り方
   18. friend
   19. 練習問題
   20. クラス変数(静的変数)
   21. 静的関数
   22. クラスと関数ポインタ

5. クラスの包含
   1. 包含とは
   2. クラスの作成・破壊
   3. メンバーイニシャライザ
   4. ポインタによる包含
   5. 参照による包含
   6. 練習問題

6. 継承
   1. 継承とは
   2. スーパークラスのコンストラクタ
   3. 継承とキャスト
   4. スコープ
   5. クラスの作成・破壊
   6. 派生の種類
   7. 仮装関数
   8. 純粋仮装関数
   9. 仮装デストラクタ
   10. 例題)例外クラス
   11. V-table(VF-table)
   12. 例題)お絵かきソフト
   13. 継承と包含
   14. 多重継承
   15. 多重継承の用途
   16. 仮想クラス
   17. 実行時型情報(RTTI)
   18. dynamic_cast

7. STL
   1. STLとは
   2. STLの歴史
   3. STLの構成
   4. コンテナ
   5. vector
   6. イタレーター
   7. クラスとSTL
   8. list
   9. queue
   10. deque
   11. priority_queue
   12. stack
   13. map
   14. mutimap
   15. set
   16. multiset
   17. bitset
   18. アルゴリズム
   19. basic_string
   20. コンテナを作ろう
   21. アルゴリズムを作ろう
   22. 配列とアルゴリズム

8. その他
   1. 変数名について

9. その後は
   1. ヒューマンアカデミー C言語講座
   2. el school C言語講座


・ トップページに戻る



・ トップページに戻る

トップ-> C++入門:6章 継承-> 継承と包含

←前ページへ :  トップへ :  次ページへ→

13. 継承と包含

新しいクラスを作成しようとした際には、次の3つの選択がある。
  1. まったくゼロから作る
  2. 既存のクラスを継承して、派生クラスとして作る
  3. 既存のクラスを包含して、新しく作る

  まったく新しい機能のクラスを作る場合は(1)のゼロから作る方法ですが、問題は (2)の継承か、(3)の包含かは、結構迷う場合もあります。プログラマー(設計者)の 経験に頼るところが大きいのですが、迷った場合は以下の5つの質問をしてみて、 すべての項目がYESだった場合は「継承」にします。どれか1つでもNOがあれば 「包含」にします。

  なお、質問事項の他にその解説と、お絵かきソフトの 例を示しました。

  • 既存のクラスの一種か(... kind of ...か)?
  文字どおり、基底クラスの一種ではないものは、派生クラスにするべきではありません。

  RectクラスやLineクラスはDiagramクラスの一種であるため、この質問はYESになります。

  • 機能の削除ではなく、機能の追加か?
  派生クラスは機能を追加するべきで、機能を削除して廉価版を作るべき ではありません。もし使い方を単純にして低機能なクラスを作るのであれば、低機能なクラスを 基底クラスにするべきです。もしくは、包含クラスとして実装する方法もあります。

  抽象クラスを派生して具象クラスを作ろうとしているので、YESになります。

  • 派生系列に、矛盾がないか?
  今までは分類で派生してきたのに、新しく派生したものは機能で分類していないか。 例えば、哺乳類クラスを派生して、犬クラス、猫クラスを作ったのに、さらに犬クラスを派生して 盲導犬クラスや警察犬クラスを作ろうとしていないか。(盲導犬や警察犬は種類ではなく、機能の追加になる。)

  1世代しか継承しないので、この質問はYESになります。

  • 既存のクラスの派生クラスにした場合、基底クラスやたの派生クラスに変更を加える必要はないか?
  他のクラスを変更するということは、それまで作ってきたプログラムが使えなくなるという ことです。他のクラスに変更したり、他のクラスが無用になるくらいなら、新しく派生クラスを つくるべきではありません。

  Rectクラス、Lineクラスが存在し、新たにCIrcleクラスを付け加える場合、どのクラスにも変更がないので、 この質問はYESになります。

  • わけのわからない(無用な)機能の追加ではないか?
  全然関係ない機能を付け加えるべきではありません。関係ない機能とは大げさに言うと Lineクラスに日付の計算をする機能を入れたりなどです。何でもこなすクラスを作るとクラス設計が複雑になり ますし、再使用することもできなくなります。そもそも複雑な具象を簡単なクラスに分解し、それを組み合わせる ことが目的だったのに、このようなクラスとは無関係な機能をつけることは、オブジェクト指向に反することに なります。

  Diagramクラスは抽象クラスで、Rectクラスなどは、その具象クラスなので、この質問もYESになります。



←前ページへ :  トップへ :  次ページへ→