C++のクラスの継承の仕組みとサンプルです。
目次
クラスの継承のイメージ
クラスがクラスを継承すると、継承先のクラスは継承元のクラスの機能を引き継ぎます。
継承先のクラスは、差分の機能を追加するだけでよくなります。
継承元のクラスのことを「基底クラス 」or 「親クラス 」or 「スーパークラス」といいます。
継承先のクラスのことを「派生クラス」 or「 子クラス」 or「 サブクラス」といいます。
継承
class クラス名 : 継承元のクラス名{ } |
- 継承するクラスは、クラス名の後に、コロン(:)と継承元のクラスを記述します。
- 継承元のクラス(親クラス)は、複数指定できます。多重継承が可能です。
コード
クラスの継承のサンプルです。
#include <iostream>
using namespace std;
//クラスを定義
class Color1
{
public:
void getName1();
};
class Color2 : public Color1
{
public:
void getName2();
};
//メンバ関数の実装
void Color1::getName1()
{
cout << "赤です\n";
return;
}
void Color2::getName2()
{
cout << "青です\n";
return;
}
//クラスを使用
int main() {
Color2 cla2;
cla2.getName1(); //赤です
cla2.getName2(); //青です
return 0;
}
5行目は、親クラス「Class1」を定義しています。
10行目は、子クラス「Class2」を定義しています。
「class Class2」の後に「 : public Class1」と記述することにより、Class2は、Class1を継承します。
16~20行目は、クラス「Class1」のメンバ関数です。8行目のgetName1メソッドの内容を記述しています。
21~25行目は、クラス「Class2」のメンバ関数です。13行目のgetName2メソッドの内容を記述しています。
28行目は、子クラス「Class2」のオブジェクトを生成しています。
(Class2型のcla2というオブジェクトを生成)
29行目のgetName1メソッドは子クラスに存在しませんが実行できます。親クラスのメソッドを実行します。
→子クラスは、親クラスのメソッドを再実装しないで済んでいます。継承の利点です。
多重継承のサンプル
多重継承のサンプルです。
#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 << "赤です\n";
return;
}
void Color2::getName2()
{
cout << "青です\n";
return;
}
void Color3::getName3()
{
cout << "白です\n";
return;
}
//クラスを使用
int main() {
Color3 cla3;
cla3.getName1(); //赤です
cla3.getName2(); //青です
cla3.getName3(); //白です
return 0;
}
15行目のクラスは、5行目と10行目のクラスを継承しています。多重継承です。
C++では多重継承が可能です。
38行目は、子クラス「Class3」のオブジェクトを生成しています。
(Color3型のcla3というオブジェクトを生成)
39,40行目は、継承元(親)のクラスのメソッドを実行しています。
子クラスから親クラスのインスタンスを参照する
子クラスから親クラスのインスタンスを参照するサンプルです。
#include <iostream>
using namespace std;
//クラスを定義
class Color1
{
public:
void getName1();
};
class Color2 : public Color1
{
public:
void getName2();
};
//メンバ関数の実装
void Color1::getName1()
{
cout << "赤です\n";
return;
}
void Color2::getName2()
{
Color1::getName1();
return;
}
//クラスを使用
int main() {
Color2 cla2;
cla2.getName1(); //赤です
cla2.getName2(); //赤です
return 0;
}
10行目のクラスは、5行目のクラスを継承しています。
23行目は、「クラス名::メソッド名」で親クラスのメソッドを呼んでいます。
30行目は、子クラスのメソッドを実行し23行目で親クラスのメソッドが実行されます。
関連の記事