Top > C++言語 > 継承(導入編)


継承とは?

継承というクラスの使い方

クラスを使う方法は、大きく分けると、下記 2 通りある

  • クラスをデータ型とした変数を宣言し、オブジェクトをメモリ上に作成してメンバの機能を利用する
  • 既存クラスを継承して新しいクラスを定義すること
構文
  • 例えば、Car クラスを継承して OpenCar というクラスを定義する場合は下記のようにする
    すべてを展開すべてを収束
      1
      2
      3
      4
    
     
    -
    |
    !
    
    class OpenCar : public Car
    {
      /* メンバの定義 */
    };
構文解説
  • 定義するクラス名の後に、コロンをつける
  • public は、継承のスタイルを指定するアクセス指定子
  • Car クラスの中で定義されているメンバが、OpenCar クラスのメンバとして引き継がれる
サンプル
すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 
 
-
|
|
|
|
!
 
 
 
-
|
!
 
 
-
|
!
 
 
 
-
|
|
|
|
|
!
#include <stdio.h>
 
class Car
{
public:
  int num;
  double gas;
  void showCar (void);
};
 
void
Car::showCar (viod)
{
  printf ("num = %d, gas = %f\n", num, gas);
}
 
class OpenCar : public Car
{
  // no member
};
 
void
main (void)
{
  OpenCar toyota;
 
  toyota.num = 1234;
  toyota.gas = 25.0;
  toyota.showCar ();
}
実行結果
num = 1234, gas = 25.000000
用語
  • 継承元となるクラスのことを基本クラス (又は、ベースクラス、スーパークラス、親クラス) と呼ぶ
  • 継承先となるクラスのことを派生クラス (又は、サブクラス、子クラス) と呼ぶ

派生クラスの定義でメンバを追加した場合は、派生クラスの持つメンバは 基本クラスのメンバと追加されたメンバとを合わせ持ったものとなる


protected の機能

  • ココで、メンバに指定するアクセス指定子には、public, private, protected の 3 種類があると紹介した
  • クラスを継承して使う場合、基本クラスの public 又は protected が指定されたメンバである
具体例
  • 下記サンプルの場合、Car クラスを使い、誤って showCar () を呼び出すことを防げる
  • Car クラスを継承して使う SuperCar クラスは、showCar () を呼び出すことができる
    すべてを展開すべてを収束
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
    
     
     
     
    -
    |
    |
    |
    |
    |
    !
     
     
     
    -
    |
    !
     
     
    -
    |
    |
    |
    !
     
     
     
    -
    |
    |
    !
     
     
     
    -
    |
    |
    |
    |
    |
    |
    !
    
    #include <stdio.h>
     
    class Car
    {
    public:
      int num;
      double gas;
    protected:
      void showCar (void);
    };
     
    void
    Car::showCar (void)
    {
      printf ("num = %d, gas = %f\n", num, gas);
    }
     
    class SuperCar : public Car
    {
    public:
      int maxSpeed;
      void showAllData (void);
    };
     
    void
    SuperCar::showAllData (void)
    {
      showCar ();
      printf ("maxSpeed = %d\n", maxSpeed);
    }
     
    void
    main (void)
    {
      SuperCar ca;
     
      ca.num = 1234;
      ca.gas = 25.00;
      ca.maxSpeed = 250;
      ca.showAllData ();
    }
実行結果
num = 1234, gas = 25.000000
maxSpeed = 250
まとめ
  • どのような使われ方をしても公開して問題ないメンバは public
  • クラスの中だけで使用するメンバは private
  • 継承して使う人にだけ意味のあるメンバには protected


継承におけるアクセス指定子の役割

  • メンバ関数と同様に、継承でも 3 種のアクセス指定子を指定することができる
  • public, private, protected の 3 種
  • アクセス指定子を省略すると、private が指定されたものとみなされる
  • 継承での各アクセス指定子によるメンバの引き継がれ方は以下を参照
継承におけるアクセス指定子.jpg


参考


添付ファイル: file継承におけるアクセス指定子.jpg 729件 [詳細]

リロード   凍結解除 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Mon, 03 Jun 2019 14:37:49 UTC (1467d)