>> C++入門トップに戻る

仮想関数

今回は仮想関数について説明します。
仮想関数とは、基底クラスで定義した関数を再定義した関数のことです。
つまり同じ名前の関数ってことです。
前回、同じ名前の関数を定義した場合は、受け取るポインタの型に従うとなっていましたが、
仮想関数として作ってしまえば、派生クラス作成時のポインタを基底クラスのポインタで受け取ったとしても、
ちゃんと派生クラス側の関数が実行されるようになります。
まずはコードを見てください。

#include <stdio.h>

//基底クラスTEST
class TEST{
public:
	virtual void output(){
		printf("TESTクラスです\n");
	}
};

//派生クラスSUPER
class SUPER : public TEST{
public:
	void output(){
		printf("SUPERクラスです\n");
	}
	
};

int main(void)
{
	//基底クラスTESTのポインタを宣言
	TEST *test[2];

	//newを使って動的確保
	test[0]=new TEST;
	test[1]=new SUPER;

	test[0]->output();
	test[1]->output();

	delete test[0];
	delete test[1];

	return 0;
}

これを実行すると、

と表示されます。

コードを見てもらうと分かるとおり、基底クラスと派生クラスにはoutputという同じ名前の関数が定義されています。
そして基底クラスの関数の前に、virtualと書かれています。
これが、この関数は仮想関数ですよと明示するためのものです。

そしてmain関数を見てください。
TESTクラスのポインタを配列として二つ宣言してますよね?
で、一つ目の要素に、TESTクラスのインスタンスのポインタを、二つ目の要素に、
SUPERクラスのインスタンスのポインタをそれぞれ代入しています。
仮想関数ではないときは、受け取るポインタのクラスに従って関数が実行されていましたが今回は違います。
それぞれoutput関数を実行していますが、
一つ目はTESTクラスのoutput関数が、二つ目は、
SUPERクラスのoutput関数が実行されているのがわかりますよね?
これが仮想関数の仕組みなのです。
どういう時に使うのかよくわからない人も多いと思います。
私もほとんど使ったことはありません。
ただ分かることとして、基底クラスのポインタだけで各派生クラスの処理をまとめて流せるということです。
例えば、この基底クラスを元に沢山の派生クラスが出来ていったらどうなるでしょうか?
もし同じ名前の関数をまとめて実行したいときに、各クラスのポインタを宣言してたら面倒だし、
コードも見にくくなります。
そんなときに仮想関数を使ってやれば、まとめて管理できるので便利なのです。
もしそんな状況に遭遇したら一度仮想関数を使ってみてはどうでしょうか?

次回はC++の文字列出力について説明します。


>> 【C++の文字列出力について】に進む
>> C++入門トップに戻る