Menu
Coddy logo textTech

継承の基本

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 48/104。

継承は、あるクラスが別のクラスのプロパティや振る舞いを受け継ぐことを可能にします。継承元のクラスは基底クラス(または親クラス)と呼ばれ、継承する側のクラスは派生クラス(または子クラス)と呼ばれます。

派生クラスを作成するには、コロンに続けてアクセス指定子と基底クラス名を記述します:

class Animal {
public:
    std::string name;
    
    void eat() {
        std::cout << name << " is eating" << std::endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        std::cout << name << " says woof!" << std::endl;
    }
};

Dogクラスは、Animalから継承したnameeat()の両方にアクセスできるようになり、さらに独自のbark()メソッドも持っています。これが継承の本質です。既存のコードを再利用しながら、新しい機能を追加することです。

Dog myDog;
myDog.name = "Buddy";
myDog.eat();    // Animalから継承
myDog.bark();   // Dogで定義

Animal の前にある public キーワードは、継承の種類を指定します。公開継承(Public inheritance)は、基底クラスの公開メンバが派生クラスでも公開メンバのまま残ることを意味します。これは最も一般的な形式であり、「is-a」関係をモデル化します。つまり、Dog Animal である という関係です。

challenge icon

チャレンジ

簡単

継承の動作を実演する簡単な車両の階層構造を構築しましょう。ベースとなる Vehicle クラスと、それを拡張して特化した動作を持つ派生クラス Motorcycle を作成します。

コードは3つのファイルに分けて構成します:

  • Vehicle.h: 以下の内容を持つベースクラス Vehicle を定義します:
    • パブリックな std::string brand メンバ
    • パブリックな int year メンバ
    • 車両のブランドと年を Brand: <brand>, Year: <year> の形式で出力するパブリックメソッド displayInfo()
  • Motorcycle.h: Vehicle をパブリックに継承する Motorcycle クラスを定義します。この派生クラスには以下を追加してください:
    • エンジンの排気量を表すパブリックな int engineCC メンバ
    • <brand> goes vroom vroom! と出力するパブリックメソッド revEngine()

    Motorcycle クラスは、Vehicle から brandyear、および displayInfo() を自動的に継承します。

  • main.cpp: 3つの入力(それぞれ別の行)を読み取ります:
    1. ブランド名 (文字列)
    2. 年 (整数)
    3. エンジン CC (整数)

    Motorcycle オブジェクトを作成し、継承されたメンバ(brandyear)および自身の engineCC メンバを設定します。次に、以下の順序で3行の出力を生成します:最初に継承された displayInfo() メソッドを呼び出し、次に std::cout << "Engine: " << moto.engineCC << "cc" << std::endl; を使用してエンジンの排気量を自分で出力し、最後にオートバイ固有の revEngine() メソッドを呼び出します。これにより、継承されたメソッドと派生クラス独自のメソッドの両方を使用することで、継承を実演します。

    出力形式:

    Brand: <brand>, Year: <year>
    Engine: <engineCC>cc
    <brand> goes vroom vroom!

例えば、入力が Harley20221200 の場合:

Brand: Harley, Year: 2022
Engine: 1200cc
Harley goes vroom vroom!

ヘッダーファイルにはインクルードガードを忘れずに追加し、ベースクラスにアクセスするために Motorcycle ヘッダーで #include "Vehicle.h" を使用してください。

自分で試してみよう

#include <iostream>
#include <string>
#include "Motorcycle.h"

using namespace std;

int main() {
    string brand;
    int year;
    int engineCC;

    cin >> brand;
    cin >> year;
    cin >> engineCC;

    // TODO: Motorcycleオブジェクトを作成する
    // TODO: そのbrand、year、およびengineCCメンバを設定する
    // TODO: displayInfo()を呼び出して継承された情報を表示する
    // TODO: エンジン情報を次の形式で出力する: Engine: <engineCC>cc
    // TODO: revEngine()を呼び出してオートバイ特有の動作を実演する

    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン