C++の継承:初心者のガイド

こんにちは、未来のC++の魔法使いたち!今日、私たちはC++の継承の魔法の世界に興味深い旅に出ます。プログラミングに初めての方でも心配いりません - 私があなたの友好的なガイドで、ステップバイステップに進みます。このチュートリアルの最後まで来ると、あなたがどれだけ学んでいるか驚きます!

C++ Inheritance

継承とは何か?

実際に始める前に、簡単な比喩から始めましょう。家族樹を作成するところを想像してみてください。子供が親から特質を継承するように、C++ではクラスが他のクラスからプロパティと動作を継承することができます。クールですよね?

継承は、オブジェクト指向プログラミングの基本概念の一つで、既存のクラスに基づいて新しいクラスを作成することができます。これにより、コードの再利用が促進され、コードを階層構造に整理するのに役立ちます。

基底クラスと派生クラス

C++の継承の世界では、二つの主要な役割があります:基底クラスと派生クラス。

基底クラス

基底クラス(または親クラス、スーパークラスとも呼ばれます)は、他のクラスが継承するクラスです。家族樹の比喩では祖先に相当します。

簡単な基底クラスを作成しましょう:

class Animal {
public:
void eat() {
cout << "この動物は食べています。" << endl;
}

void sleep() {
cout << "この動物は寝ています。" << endl;
}
};

この例では、Animalが基底クラスです。二つのメソッドeat()sleep()があります。これらは、ほとんどの動物が共有する一般的な動作です。

派生クラス

派生クラス(または子クラス、サブクラスとも呼ばれます)は、基底クラスから継承するクラスです。家族樹の中の子孫に相当します。

派生クラスを作成しましょう:

class Dog : public Animal {
public:
void bark() {
cout << "ワフ!ワフ!" << endl;
}
};

ここで、Dogが派生クラスです。Animalから継承するので、eat()メソッドとsleep()メソッドを自動的に持ちます。また、犬特有のbark()メソッドも追加しました。

次に、これらのクラスをどのように使用するかを見ていきましょう:

int main() {
Dog myDog;
myDog.eat();   // 出力:この動物は食べています。
myDog.sleep(); // 出力:この動物は寝ています。
myDog.bark();  // 出力:ワフ!ワフ!
return 0;
}

驚きでしょうか?Dogクラスは、再書き込むことなくAnimalクラスのメソッドを使用することができます!

アクセス制御と継承

さて、私たちのC++ファミリーで誰が何を見られるかについて話しましょう。実際の家族と同様に、いくつかは公共の知識で、いくつかは家族メンバーだけで、そしていくつかは個人的な秘密です。

C++には、三つのアクセスレベルがあります:

  1. 公開(public)
  2. 保護(protected)
  3. 私有(private)

これらが継承とどのように機能するかを見ていきましょう:

class Animal {
public:
int age;
protected:
string name;
private:
int secretCode;
};

class Dog : public Animal {
public:
void setName(string n) {
name = n;  // オッケー、'name'はAnimalで保護されています
}
void setSecretCode(int code) {
// secretCode = code;  // エラー!'secretCode'はAnimalでプライベートです
}
};

この例では:

  • ageは公開で、どこからでもアクセス可能です。
  • nameは保護されているので、AnimalとAnimalから派生したクラスの中でアクセス可能です。
  • secretCodeはプライベートで、Animalクラスの中だけでアクセス可能です。

継承の種類

C++は、さまざまなニーズに合わせて異なる継承のスタイルを提供します。それぞれを探っていきましょう!

単一継承

これは最もシンプルな形式で、クラスが単一の基底クラスから継承します。私たちのDogの例ではすでに見てきました。

多段継承

これは家族の系統と似ています:孫が父から継承し、父が祖父から継承します。

class Animal {
public:
void eat() { cout << "食べています..." << endl; }
};

class Mammal : public Animal {
public:
void breathe() { cout << "呼吸しています..." << endl; }
};

class Dog : public Mammal {
public:
void bark() { cout << "吠えています..." << endl; }
};

int main() {
Dog myDog;
myDog.eat();     // Animalから
myDog.breathe(); // Mammalから
myDog.bark();    // Dogから
return 0;
}

階層継承

これは、複数のクラスが単一の基底クラスから継承する場合です。家族の兄弟と考えてみてください。

class Animal {
public:
void eat() { cout << "食べています..." << endl; }
};

class Dog : public Animal {
public:
void bark() { cout << "吠えています..." << endl; }
};

class Cat : public Animal {
public:
void meow() { cout << "にゃんにゃん..." << endl; }
};

複数継承

複数継承は、クラスが複数の基底クラスから継承することです。両親から特質を持つようにです!

class FlyingCreature {
public:
void fly() { cout << "飛んでいます..." << endl; }
};

class SwimmingCreature {
public:
void swim() { cout << "泳いでいます..." << endl; }
};

class Duck : public FlyingCreature, public SwimmingCreature {
public:
void quack() { cout << "ガーガー..." << endl; }
};

int main() {
Duck myDuck;
myDuck.fly();   // FlyingCreatureから
myDuck.swim();  // SwimmingCreatureから
myDuck.quack(); // Duckから
return 0;
}

ただし、注意してください!複数継承は、注意しないと有名な「ダイヤモンド問題」につながる可能性があります。

継承メソッド一覧表

以下は、私たちが話し合った継承メソッドの便利な一覧表です:

継承の種類 説明
単一継承 クラスが一つの基底クラスを継承 Dog : public Animal
多段継承 クラスが派生クラスを継承 Dog : public Mammal, Mammal : public Animal
階層継承 複数のクラスが一つの基底クラスを継承 Dog : public Animal, Cat : public Animal
複数継承 クラスが複数の基底クラスを継承 Duck : public FlyingCreature, public SwimmingCreature

それでは、皆さん!C++の継承の基本についてお話ししました。練習は成功の一部ですので、これらの概念について実験してみてください。幸せなコーディングをお願いします。継承があなたと共にあることを!

Credits: Image by storyset