導入
似たクラスがいくつもあるとき、共通部分を1つの「親クラス(基底クラス)」にまとめ、各クラスはそれを引き継いで差分だけ書けます。これが「継承」です。コードの重複を減らす基本のしくみです。
説明
class 子 : public 親 { ... } と書くと、子クラス(派生クラス)は親のメンバを引き継ぎます。共通の name と eat() を親に置き、種類ごとの違いは子に書きます。
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 にします。