忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

第6回 C++講座 『オーバーライド』


中原です。

最初に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

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

TRACKBACK

Trackback URL:

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]