中原です。
最初にC++のオブジェクト指向の補足。
C++のクラスを作る場合。
そのクラスのみで完結している、というのがベストです。
他のクラスの仕様が変わったからと言って、そのクラスを作り変えないと駄目というのは、クラスの作り方が甘いと思っていいでしょう。
ただ、ベストというだけであって、必ずしもと言うわけではありません。
実際そのように作るのが難しい場合も多く、出来るだけそうならないよう、もし無理な場合でも出来るだけ少なくなるように作るようにしましょう。
さてさて、今日の講座はオーバーライド。
前回のオーバロードと似ていますね。
でも全然違うんです。
しっかりと、違いを理解しましょう。
今回も短く終わりそうな感じです。
では早速いってみよう!
第6回 C++講座 『オーバーライド』
[0回]
オーバーライドとは、日本語で上書きという意味です。
その名の通り、関数を上書きすることなんです。
では、いつもどおり例にいってみましょう。
//===========================
// Testクラス
//===========================
class CTest
{
public:
void func()
{
printf("CTestクラスのメソッドを呼び出しました。¥n");
}
};
//============================
// CTestExクラス
// CTestクラスを継承
//============================
class CTestEx : public CTest
{
public:
void func()
{
printf("CTestExクラスのメソッドを呼び出しました。¥n");
}
};
CTestクラスには func と言う関数があります。
また、CTestクラスを継承して出来たCTestExクラスにも、同じ func という関数がありますよね。
このように、
派生クラスで、基底クラスの関数を宣言し、実装することを オーバーライドと言います。
さて、ではこれらのクラスを宣言して func 関数を実行した場合、どう呼ばれるのでしょう。
使用は以下の通りです。
main()
{
CTest test;
CtestEx testEx;
test.func();
testEx.func();
}
CTestクラスのメソッドを呼び出しました。
CTestExクラスのメソッドを呼び出しました。
と表示されます。
CTestクラスのfunc関数を
上書きして新しくfunc関数を作ったのですから、
変数testExではCTestExクラスのメンバ関数が呼び出されるのです。
ゲーム製作の場合、どういうときに使うのかと言うと、
基底クラスで基本的な使い方としてメソッドを作ったのはいいが、派生クラスで 「ちょっと違うようにしたい」 という時によく用いられます。
勿論使い方は、それだけではなく様々に使うことが出来ます。
またもこれもプログラマの創造性次第なんですね。
でも一つ注意してください。
創造性といっても、
オブジェクト指向でプログラムを組んでいるというのを忘れないで頂きたいのです。
例えば、
関数の意味も全く違うのにオーバーライドしても、クラスを使う人にとって全く意味が分からないですよね。
基底クラスのメソッドを使っても、派生クラスのメソッドを使っても
結果(求めたいこと)は一緒なのに、実は中身で違うことをしている。
『使う人にとって、同じ関数を呼んだつもりなのに…、気付かれないうちに?!』 と言うのが大事なのです。
最後に、派生クラスでも基底クラスのオーバーライド前の関数の呼び方をお教えしておきます。
クラス名 :: 関数名()
と書くことによって呼び出すことが出来ます。
例のクラスで言うと、
CTest::func();
となります。
『::』 のことを
スコープ演算子といい、この場合 ~の と言う意味になります。
CTestクラスのfunc関数って意味ですね。
以上で今日の講座は終わりです。
次の講座の内容はまだ、ちょっと決めかねているのですが、いいのが思いつかなければ、最後の3本柱である「ポリモフィズム」について述べたいと思います。
中原でした。
PR
COMMENT