C++のオーバーライドのサンプルです。
目次
サンプル | オーバーライド |
オーバーライドのサンプル | |
オーバーライドではないサンプル | |
子クラスから親クラスのインスタンスを参照する |
オーバーライド
- クラスを継承したときに使用できます。
- オブジェクトを生成してメソッドを実行する時、変数の型ではなく、インスタンスの型でメソッドを実行します。
- 親クラスのメソッドにvirtualキーワードをつけます。
- 子クラスのメソッドにoverrideキーワードをつけることができます。省略可能ですがあると親クラスとオーバーライドになっていない場合エラーにしてくれます。
- 似た名前として、オーバーロードがありますがそれとは別物です。
オーバーライドのサンプル
#include <iostream>
using namespace std;
// 親クラス
class Class1
{
public:
virtual void print1(){
cout << "red";
};
};
// 子クラス
class Class2 : public Class1
{
public:
void print1() override {
cout << "blue";
};
};
// クラスを使用
int main() {
Class1 *c2 = new Class2;
c2->print1(); // blue
}
4行目のClass1は、親クラスです。
7行目は、メソッドの前にvirtualがついています。
12行目のClass2は、Class1を継承した子クラスです。
15行目は、7行目と同じメソッド名です。メソッドの後ろのoverrideがついています。
21行目は、子クラスのインスタンスを生成しています。
22行目は、子クラスのメソッドが実行されます。
オーバーライドなので変数の型(Class1)ではなくインスタンスの型(Class2)でメソッドが実行されます。
オーバーライドではないサンプル
上記のコードからvirtualとoverrideを指定しない場合のサンプルです。
#include <iostream>
using namespace std;
// 親クラス
class Class1
{
public:
void print1(){
cout << "red";
};
};
// 子クラス
class Class2 : public Class1
{
public:
void print1() {
cout << "blue";
};
};
// クラスを使用
int main() {
Class1 *c2 = new Class2;
c2->print1(); // red
}
7行目は、メソッドの前にvirtualがついていません。
15行目もメソッドの後ろのoverrideがついていません。
21行目は、子クラスのインスタンスを生成しています。
22行目は、親クラス「Class1」のprint1メソッドが実行されます。
オーバーライドではないので、インスタンスの型(Class2)ではなく変数の型(Class1)でメソッドが実行されます。
子クラスから親クラスのインスタンスを参照する
子クラスから親クラスのインスタンスを参照するサンプルです。
#include <iostream>
using namespace std;
// 親クラス
class Class1
{
public:
virtual void print1() {
cout << "red";
};
};
// 子クラス
class Class2 : public Class1
{
public:
void print1() override {
Class1::print1();
};
};
//クラスを使用
int main() {
Class1* c2 = new Class2;
c2->print1(); // red
}
4行目のClass1は親クラスです。
7行目は、メソッドの前にvirtualがついています。
12行目のClass2は子クラスです。
15行目は、メソッドの後ろのoverrideがついています。
16行目は、「クラス名::メソッド名」で親クラスのメソッドを呼んでいます。
22行目は、子クラスのメソッドを実行し16行目で親クラスのメソッドが実行されます。
関連の記事