C++ で 3 つの異なる継承メソッドを設計する重要性

C++ では、継承はオブジェクト指向プログラミングの中核概念の 1 つです。継承により、クラス (サブクラス) は別のクラス (親クラス) からプロパティとメソッドを継承できます。publicC++ では、継承、protected継承、継承という 3 つの異なる継承方法がありますprivate各継承メソッドには、独自の重要性と使用シナリオがあります。

パブリック継承

public継承は最も一般的な継承方法であり、デフォルトの継承方法でもあります。継承では、サブクラスは親クラスのメンバーにpublicアクセスできますが、親クラスのメンバーにはアクセスできません。パブリック継承の重要性は、サブクラスが親クラスのインターフェイス (メンバー) を継承できるため、サブクラスが親クラスのメソッドとプロパティをより便利に使用できることです。publicprivatepublic

保護された継承

protected相続とは、public相続とprivate相続の間の相続方法のことです。継承では、サブクラスはメンバおよび親クラスのメンバprotectedにアクセスできますが、親クラスのメンバにはアクセスできません継承の重要性は、サブクラスが親クラスのメンバーにアクセスできるようになり、サブクラスが親クラスの実装の詳細を公開せずに親クラスの実装を再利用できるようになることです。protectedpublicprivateprotectedprotected

私的継承

private継承は、継承の最も厳密な形式です。継承では、サブクラスは親クラスとメンバーprivateにアクセスできますが、親クラスのメンバーにはアクセスできません。継承の重要性は、サブクラスが親クラスのインターフェイスを直接使用することを防ぐことができますが、独自のメソッドを通じて実装する必要があることです。このメソッドは通常、実装の詳細を隠すために使用されます。つまり、サブクラスが親クラスの実装の詳細にアクセスできないようにします。protectedpublicprivateprivate

C++ の継承メソッドは、コードの再利用と継承を実現するために設計されており、同時にコード実装の詳細の隠蔽と保護も実現できます。さまざまな継承方法がさまざまなシナリオで役割を果たすことができます。

Animal クラスがありAnimal、3 つの派生クラスDogおよびCatBirdそれぞれ継承しているとしますAnimal以下は、さまざまな継承メソッドを使用したコード例です。

パブリック継承

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

class Dog : public Animal {
    
    
public:
    void bark() {
    
    
        cout << "Dog is barking" << endl;
    }
};

class Cat : public Animal {
    
    
public:
    void meow() {
    
    
        cout << "Cat is meowing" << endl;
    }
};

class Bird : public Animal {
    
    
public:
    void fly() {
    
    
        cout << "Bird is flying" << endl;
    }
};

ここでDogCatと はBirdすべてクラスpublicから継承されます。これは、クラスのパブリック メンバー (関数など) に独自のパブリック メンバーとしてAnimalアクセスできることを意味します。Animaleat()

保護された継承

class Animal {
    
    
protected:
    void eat() {
    
    
        cout << "Animal is eating" << endl;
    }
};

class Dog : protected Animal {
    
    
public:
    void bark() {
    
    
        cout << "Dog is barking" << endl;
        eat();
    }
};

class Cat : protected Animal {
    
    
public:
    void meow() {
    
    
        cout << "Cat is meowing" << endl;
        eat();
    }
};

class Bird : protected Animal {
    
    
public:
    void fly() {
    
    
        cout << "Bird is flying" << endl;
        eat();
    }
};

ここでDogCatと はBirdすべてクラスprotectedから継承されます。これは、クラス内の保護されたメンバー (関数など) に独自の保護されたメンバーとしてAnimalアクセスできることを意味します。この関数は保護されたメンバーであるため、両方で直接アクセスできます。Animaleat()eat()DogCatBird

私的継承

class Animal {
    
    
private:
    void eat() {
    
    
        cout << "Animal is eating" << endl;
    }
};

class Dog : private Animal {
    
    
public:
    void bark() {
    
    
        cout << "Dog is barking" << endl;
        eat();
    }
};

class Cat : private Animal {
    
    
public:
    void meow() {
    
    
        cout << "Cat is meowing" << endl;
        eat();
    }
};

class Bird : private Animal {
    
    
public:
    void fly() {
    
    
        cout << "Bird is flying" << endl;
        eat();
    }
};

ここでDogCatと はBirdすべてクラスprivateから継承されます。これは、クラスのパブリック メンバーまたは保護されたメンバーにはAnimalアクセスできず、独自のプライベート メンバーとしてのみアクセスできることを意味します。この関数はプライベート メンバーであるAnimalため、およびで直接アクセスすることはできません関数の呼び出しなど、 で公開されるインターフェイスを介してのみアクセスできます。eat()DogCatBirdAnimaleat()

よりわかりやすく説明するには、次の例のようにします。

ゲームを書いているとします。このゲームには複数のキャラクターがあり、各キャラクターには独自の属性 (血液量、攻撃力など) と行動 (移動、攻撃など) があり、それらの間には異なる関係があります。キャラクター(チーム関係、敵対関係など)。このゲームの実装には C++ を使用します。

まず、すべてのキャラクターの共通の属性と動作を表す基本クラスが必要です。Character次のように、ロールの基本的なプロパティと動作を含む " " というクラスを定義できます。

class Character {
    
    
protected:
    int health;
    int attackPower;
public:
    virtual void move(int x, int y) = 0;
    virtual void attack(Character& target) = 0;
};

このクラスでは、アクセス修飾子を使用しましたprotected。これは、サブクラスはこれらのプロパティとメソッドにアクセスできますが、他のクラスはアクセスできないことを意味します。同時に、純粋仮想関数も使用します。これは、宣言されるだけで実装されない関数であり、これらの関数をサブクラスでオーバーライドする必要があることをコンパイラーに伝えます。

次に、さまざまなタイプのロールを表すいくつかのサブクラスを定義できます。たとえば、Warrior次のように戦闘機を表す " " クラスを定義できます。

class Warrior : public Character {
    
    
public:
    Warrior() {
    
    
        health = 100;
        attackPower = 10;
    }
    void move(int x, int y) override {
    
    
        // 移动逻辑
    }
    void attack(Character& target) override {
    
    
        // 攻击逻辑
    }
};

このクラスでは継承を使用しましたpublic。これは、子クラスが親クラスのすべてのプロパティとメソッドを継承し、これらのプロパティとメソッドは一意でありpublic、他のクラスからアクセスできることを意味します。同時に、基本クラスの純粋仮想関数を書き換えて、戦闘機の特定の動作を実現します。

戦闘機に加えて、魔術師、射手など、他のタイプの役割を定義することもできます。これらのロールはすべて基本クラス " Character" から継承され、さまざまな要件に応じてさまざまな継承メソッドを使用できます。

たとえば、Wizard次のようにメイジを表す " " クラスを定義できます。

class Wizard : protected Character {
    
    
public:
    Wizard() {
    
    
        health = 50;
        attackPower = 20;
    }
    void move(int x, int y) override {
    
    
        // 移动逻辑
    }
    void attack(Character& target) override {
    
    
        // 攻击逻辑
    }
};

このクラスでは継承を使用しましたprotected。これは、子クラスが親クラスのすべてのプロパティとメソッドを継承することを意味しますが、これらのプロパティとメソッドはプライベートでありprotected、他のクラスからアクセスすることはできません。

private継承については、上記の説明に従って自分で実装し、自分で実行すると、理解が深まります。

おすすめ

転載: blog.csdn.net/shanniuliqingming/article/details/130024734