本文へスキップ
BecomeCoder

C++コース · 第11章 継承とポリモーフィズム ― 型を広げる · レッスン44

継承 ― 共通部分をまとめる

ブラウザで完結

導入

似たクラスがいくつもあるとき、共通部分を1つの「親クラス(基底クラス)」にまとめ、各クラスはそれを引き継いで差分だけ書けます。これが「継承」です。コードの重複を減らす基本のしくみです。

説明

class 子 : public 親 { ... } と書くと、子クラス(派生クラス)は親のメンバを引き継ぎます。共通の nameeat() を親に置き、種類ごとの違いは子に書きます。

flowchart TB
  A["Animal(基底クラス)<br/>name / eat()"]
  A --> B["Dog(派生)<br/>fetch()"]
  A --> C["Cat(派生)<br/>climb()"]
#include <iostream>
#include <string>
using namespace std;

class Animal {
public:
    string name;
    Animal(string n) : name(n) {}
    void eat() { cout << name << " は食べる" << endl; }
};

class Dog : public Animal {
public:
    Dog(string n) : Animal(n) {}   // 親のコンストラクタを呼ぶ
    void fetch() { cout << name << " はボールを取ってくる" << endl; }
};

int main() {
    Dog d("ポチ");
    d.eat();     // 親から引き継いだ(ポチ は食べる)
    d.fetch();   // Dog 独自(ポチ はボールを取ってくる)
    return 0;
}

親のメンバを子(や孫)からは使いたいが、外部には隠したい――そんなときは protected を使います。private は子からも見えませんが、protected は子からは見えます。

flowchart TB
  a["public:外からも子からも見える"]
  b["protected:子からは見える・外からは隠す"]
  c["private:自分のクラスだけ"]
  a --- b --- c

まとめ

class 子 : public 親 で親のメンバを引き継ぎます。子のコンストラクタは初期化リストで : 親(...) と親のコンストラクタを呼びます。子に見せたいが外には隠したいメンバは protected にします。

実際に動かしてみよう

下のエディタにC++を書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のC++コンパイラ(clang + libc++)がその場でコンパイルして実行し、出力が表示されます。std::string・vector・クラス・テンプレート・STL などモダンC++がそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(cin)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。