C++のクラスの継承の仕組みとサンプルです。
目次
サンプル | クラスの継承とは |
クラスの継承のサンプル | |
多重継承のサンプル | |
子クラスから親クラスのインスタンスを参照する |
クラスの継承とは
クラスがクラスを継承すると、継承先のクラスは継承元のクラスの機能を引き継ぎます。
継承先のクラスは、差分の機能を追加するだけでよくなります。
継承元のクラスのことを「基底クラス 」or 「親クラス 」or 「スーパークラス」といいます。
継承先のクラスのことを「派生クラス」 or「 子クラス」 or「 サブクラス」といいます。
継承は、オブジェクト指向の3大要素の一つです。(他はカプセル化とポリモーフィズム)
クラスの継承のサンプル
class クラス名 : 継承元のクラス名{ } |
- 継承するクラスは、クラス名の後に、コロン(:)と継承元のクラスを記述します。
- 継承元のクラス(親クラス)は、複数指定できます。多重継承が可能です。
クラスの継承のサンプルです。
#include <iostream>
using namespace std;
//クラスを定義
class Color1
{
public:
void getName1();
};
class Color2 : public Color1
{
public:
void getName2();
};
//メンバ関数の実装
void Color1::getName1()
{
cout << "RED\n";
return;
}
void Color2::getName2()
{
cout << "BLUE\n";
return;
}
//クラスを使用
int main() {
Color2 c2;
c2.getName1(); //RED
c2.getName2(); //BLUE
return 0;
}
5行目は、親クラス「Color1」を定義しています。
10行目は、子クラス「Color2」を定義しています。
「class Color2」の後に「 : public Colo1」と記述することにより、Color2は、Color1を継承します。
28行目は、子クラス「Color2」のオブジェクトを生成しています。
(Color2型のc2というオブジェクトを生成)
29行目のgetName1メソッドは子クラスに存在しませんが実行できます。親クラスのメソッドを実行します。
→子クラスは、親クラスのメソッドを再実装しないで済んでいます。継承の利点です。
多重継承のサンプル
C++では多重継承が可能です。
#include <iostream>
using namespace std;
//クラスを定義
class Color1
{
public:
void getName1();
};
class Color2
{
public:
void getName2();
};
class Color3 : public Color1, public Color2
{
public:
void getName3();
};
//メンバ関数の実装
void Color1::getName1()
{
cout << "RED\n";
return;
}
void Color2::getName2()
{
cout << "BLUE\n";
return;
}
void Color3::getName3()
{
cout << "WHITE\n";
return;
}
//クラスを使用
int main() {
Color3 c3;
c3.getName1(); //RED
c3.getName2(); //BLUE
c3.getName3(); //WHITE
return 0;
}
15行目のクラスは、5行目と10行目のクラスを継承しています。多重継承です。
C++では多重継承が可能です。
38行目は、「Color3」のオブジェクトを生成しています。
(Color3型のc3というオブジェクトを生成)
39,40行目は、継承元(親)のクラスのメソッドを実行しています。
子クラスから親クラスのインスタンスを参照する
子クラスから親クラスのインスタンスを参照するサンプルです。
#include <iostream>
using namespace std;
//クラスを定義
class Color1
{
public:
void getName1();
};
class Color2 : public Color1
{
public:
void getName2();
};
//メンバ関数の実装
void Color1::getName1()
{
cout << "RED\n";
return;
}
void Color2::getName2()
{
Color1::getName1();
return;
}
//クラスを使用
int main() {
Color2 c2;
c2.getName1(); //RED
c2.getName2(); //RED
return 0;
}
10行目のクラスは、5行目のクラスを継承しています。
23行目は、「クラス名::メソッド名」で親クラスのメソッドを呼んでいます。
30行目は、子クラスのメソッドを実行し23行目で親クラスのメソッドが実行されます。
関連の記事