C++ オーバーライドのサンプル

C++のオーバーライドのサンプルです。

目次

オーバーライド

  • クラスを継承したときに使用できます。
  • オブジェクトを生成してメソッドを実行する時、変数の型ではなく、インスタンスの型でメソッドを実行します。
  • 親クラスのメソッドにvirtualキーワードをつけます。
  • 子クラスのメソッドにoverrideキーワードをつけることができます。省略可能ですがあると親クラスとオーバーライドになっていない場合エラーにしてくれます。
  • 似た名前として、オーバーロードがありますがそれとは別物です。

オーバーライドのサンプル

オーバーライドのサンプルです。

#include <iostream>
using namespace std;
// 親クラス
class Class1
{
public:
	virtual void print1(){
		cout << "赤です";
	};
};
// 子クラス
class Class2 : public Class1
{
public:
	void print1() override {
		cout << "青です";
	};
};
// クラスを使用
int main() {
	Class1 *c2 = new Class2;
	c2->print1(); // 青です
}

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 << "赤です";
	};
};
// 子クラス
class Class2 : public Class1
{
public:
	void print1()  {
		cout << "青です";
	};
};
// クラスを使用
int main() {
	Class1 *c2 = new Class2;
	c2->print1(); // 赤です
}

7行目は、メソッドの前にvirtualがついていません。
15行目もメソッドの後ろのoverrideがついていません。
21行目は、子クラスのインスタンスを生成しています。
22行目は、親クラス「Class1」のprint1メソッドが実行されます。
オーバーライドではないので、インスタンスの型(Class2)ではなく変数の型(Class1)でメソッドが実行されます。

子クラスから親クラスのインスタンスを参照する

子クラスから親クラスのインスタンスを参照するサンプルです。

#include <iostream>
using namespace std;
// 親クラス
class Class1
{
public:
	virtual void print1() {
		cout << "赤です";
	};
};
// 子クラス
class Class2 : public Class1
{
public:
	void print1() override {
		Class1::print1();
	};
};
//クラスを使用
int main() {
	Class1* c2 = new Class2;
	c2->print1(); // 赤です
}

4行目のClass1は親クラスです。
7行目は、メソッドの前にvirtualがついています。
12行目のClass2は子クラスです。
15行目は、メソッドの後ろのoverrideがついています。
16行目は、「クラス名::メソッド名」で親クラスのメソッドを呼んでいます。
22行目は、子クラスのメソッドを実行し16行目で親クラスのメソッドが実行されます。

関連の記事

C++入門 クラスの仕組みとサンプル
C++ クラスのコンストラクタのサンプル
C++ クラスの継承の仕組みとサンプル

△上に戻る