C++ では、継承はオブジェクト指向プログラミングの中核概念の 1 つです。継承により、クラス (サブクラス) は別のクラス (親クラス) からプロパティとメソッドを継承できます。public
C++ では、継承、protected
継承、継承という 3 つの異なる継承方法がありますprivate
。各継承メソッドには、独自の重要性と使用シナリオがあります。
パブリック継承
public
継承は最も一般的な継承方法であり、デフォルトの継承方法でもあります。継承では、サブクラスは親クラスのメンバーにpublic
アクセスできますが、親クラスのメンバーにはアクセスできません。パブリック継承の重要性は、サブクラスが親クラスのインターフェイス (メンバー) を継承できるため、サブクラスが親クラスのメソッドとプロパティをより便利に使用できることです。public
private
public
保護された継承
protected
相続とは、public
相続とprivate
相続の間の相続方法のことです。継承では、サブクラスはメンバおよび親クラスのメンバprotected
にアクセスできますが、親クラスのメンバにはアクセスできません。継承の重要性は、サブクラスが親クラスのメンバーにアクセスできるようになり、サブクラスが親クラスの実装の詳細を公開せずに親クラスの実装を再利用できるようになることです。protected
public
private
protected
protected
私的継承
private
継承は、継承の最も厳密な形式です。継承では、サブクラスは親クラスとメンバーprivate
にアクセスできますが、親クラスのメンバーにはアクセスできません。継承の重要性は、サブクラスが親クラスのインターフェイスを直接使用することを防ぐことができますが、独自のメソッドを通じて実装する必要があることです。このメソッドは通常、実装の詳細を隠すために使用されます。つまり、サブクラスが親クラスの実装の詳細にアクセスできないようにします。protected
public
private
private
C++ の継承メソッドは、コードの再利用と継承を実現するために設計されており、同時にコード実装の詳細の隠蔽と保護も実現できます。さまざまな継承方法がさまざまなシナリオで役割を果たすことができます。
Animal クラスがありAnimal
、3 つの派生クラスDog
およびCat
がBird
それぞれ継承しているとします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;
}
};
ここでDog
、Cat
と はBird
すべてクラスpublic
から継承されます。これは、クラスのパブリック メンバー (関数など) に独自のパブリック メンバーとしてAnimal
アクセスできることを意味します。Animal
eat()
保護された継承
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();
}
};
ここでDog
、Cat
と はBird
すべてクラスprotected
から継承されます。これは、クラス内の保護されたメンバー (関数など) に独自の保護されたメンバーとしてAnimal
アクセスできることを意味します。この関数は保護されたメンバーであるため、との両方で直接アクセスできます。Animal
eat()
eat()
Dog
Cat
Bird
私的継承
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();
}
};
ここでDog
、Cat
と はBird
すべてクラスprivate
から継承されます。これは、クラスのパブリック メンバーまたは保護されたメンバーにはAnimal
アクセスできず、独自のプライベート メンバーとしてのみアクセスできることを意味します。この関数はプライベート メンバーであるAnimal
ため、およびで直接アクセスすることはできません。関数の呼び出しなど、 で公開されるインターフェイスを介してのみアクセスできます。eat()
Dog
Cat
Bird
Animal
eat()
よりわかりやすく説明するには、次の例のようにします。
ゲームを書いているとします。このゲームには複数のキャラクターがあり、各キャラクターには独自の属性 (血液量、攻撃力など) と行動 (移動、攻撃など) があり、それらの間には異なる関係があります。キャラクター(チーム関係、敵対関係など)。このゲームの実装には 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
継承については、上記の説明に従って自分で実装し、自分で実行すると、理解が深まります。