C++ 継承
C++ の継承
このチュートリアルでは、例を使って C++ の継承について学びます。
継承は、C++ でのオブジェクト指向プログラミングの重要な機能の 1 つです。既存のクラス (基本クラス) から新しいクラス (派生クラス) を作成できます。
派生クラスは基本クラスから機能を継承します 独自の追加機能を持つことができます。たとえば、
class Animal {
// eat() function
// sleep() function
};
class Dog : public Animal {
// bark() function
};
ここでは、Dog
クラスは Animal
から派生します クラス。 Dog
以降 Animal
から派生 、 Animal
のメンバー Dog
にアクセス可能です .
キーワード public
の使用に注意してください Animal から Dog を継承しています。
class Dog : public Animal {...};
キーワード private
も使用できます および protected
public
の代わりに . private
の使用の違いについて学習します。 、 public
および protected
関係
継承は is-a 関係 . is-a Relationship の場合にのみ継承を使用します 2 つのクラスの間に存在します。
以下にいくつかの例を示します:
- 車は乗り物です。
- オレンジは果物です。
- 外科医は医者です。
- 犬は動物です。
例 1:C++ 継承の簡単な例
// C++ program to demonstrate inheritance
#include <iostream>
using namespace std;
// base class
class Animal {
public:
void eat() {
cout << "I can eat!" << endl;
}
void sleep() {
cout << "I can sleep!" << endl;
}
};
// derived class
class Dog : public Animal {
public:
void bark() {
cout << "I can bark! Woof woof!!" << endl;
}
};
int main() {
// Create object of the Dog class
Dog dog1;
// Calling members of the base class
dog1.eat();
dog1.sleep();
// Calling member of the derived class
dog1.bark();
return 0;
}
出力
I can eat! I can sleep! I can bark! Woof woof!!
ここで、犬1 (派生クラス Dog
のオブジェクト ) は基本クラス Animal
のメンバーにアクセスできます . Dog
だからです Animal
から継承されます .
// Calling members of the Animal class
dog1.eat();
dog1.sleep();
C++ 保護メンバー
アクセス修飾子 protected
C++ の継承に関しては特に重要です。
private
のように メンバー、protected
クラス外からメンバーにアクセスすることはできません。ただし、派生クラスからアクセスできます フレンド クラス/関数 .
protected
が必要です クラスのデータを非表示にしたいが、そのデータをその派生クラスに継承させたい場合のメンバー。
protected の詳細については、C++ アクセス修飾子のチュートリアルを参照してください。
例 2 :C++ 保護メンバー
// C++ program to demonstrate protected members
#include <iostream>
#include <string>
using namespace std;
// base class
class Animal {
private:
string color;
protected:
string type;
public:
void eat() {
cout << "I can eat!" << endl;
}
void sleep() {
cout << "I can sleep!" << endl;
}
void setColor(string clr) {
color = clr;
}
string getColor() {
return color;
}
};
// derived class
class Dog : public Animal {
public:
void setType(string tp) {
type = tp;
}
void displayInfo(string c) {
cout << "I am a " << type << endl;
cout << "My color is " << c << endl;
}
void bark() {
cout << "I can bark! Woof woof!!" << endl;
}
};
int main() {
// Create object of the Dog class
Dog dog1;
// Calling members of the base class
dog1.eat();
dog1.sleep();
dog1.setColor("black");
// Calling member of the derived class
dog1.bark();
dog1.setType("mammal");
// Using getColor() of dog1 as argument
// getColor() returns string data
dog1.displayInfo(dog1.getColor());
return 0;
}
出力
I can eat! I can sleep! I can bark! Woof woof!! I am a mammal My color is black
ここで、変数 type protected
です したがって、派生クラス Dog
からアクセスできます . type
を初期化したので、これを見ることができます Dog
で 関数 setType()
を使用するクラス .
一方、private
変数 色 Dog
で初期化できません .
class Dog : public Animal {
public:
void setColor(string clr) {
// Error: member "Animal::color" is inaccessible
color = clr;
}
};
また、protected
キーワードがデータを隠しているため、type にアクセスできません Dog
のオブジェクトから直接 または Animal
クラス。
// Error: member "Animal::type" is inaccessible
dog1.type = "mammal";
C++ 継承のアクセス モード
以前のチュートリアルでは、public、private、protected などの C++ アクセス指定子について学習しました。
これまでは public
を使用してきました 既存の基本クラスからクラスを継承するためのキーワード。ただし、 private
も使用できます と protected
クラスを継承するためのキーワード。たとえば、
class Animal {
// code
};
class Dog : private Animal {
// code
};
class Cat : protected Animal {
// code
};
クラスを派生させるさまざまな方法は、アクセス モードとして知られています。 .これらのアクセス モードには次の効果があります:
<オール>public
で派生クラスが宣言されている場合 モードの場合、基本クラスのメンバーはそのまま派生クラスに継承されます。private
になります。 派生クラスのメンバーpublic
基本クラスのメンバーは protected
になります 派生クラスのメンバー
private
基本クラスのメンバーは常に private
です 派生クラスで。
詳細については、C++ パブリック、プライベート、保護された継承のチュートリアルをご覧ください。
継承でオーバーライドするメンバー関数
基本クラスと派生クラスに、同じ名前と引数を持つメンバー関数があるとします。
派生クラスのオブジェクトを作成し、そのメンバー関数にアクセスしようとすると、基本クラスのメンバー関数ではなく、派生クラスのメンバー関数が呼び出されます。
派生クラスのメンバー関数は、基本クラスのメンバー関数をオーバーライドします。
C++ での関数のオーバーライドの詳細をご覧ください。
推奨読書: C++ 多重継承
C言語