« Mayaのmelスクリプトの書き方 | トップページ | [エクスプレッション]で動きを制御 »

2017年1月23日 (月)バグを事前に防ごう

皆さん、こんにちは。本日当番のプログラマーのR.Hです。

プログラムを書いているとバグはつきものですが、これを事前に防ぐ小ネタをひとつ紹介したいと思います。
結論から先に言いますと、仮想関数オーバーライド時には override キーワードを使用しようというものです。
基底クラスに仮想関数を定義し、継承先でオーバーライドする事があると思いますが、みなさんはこのとき override キーワードを使用しているでしょうか?
おそらく以下のようなコードを書いている人が多いのではないでしょうか。

  class Hoge
  {
  public:
    virtual void Func();
  }

  class Foo : public Hoge
  {
  public:
    virtual void Func();
  }

基底クラス Hoge を継承した Foo クラスで、基底クラスの仮想関数 Func をオーバーライドする。
上記のコードに問題はなく、正しくコンパイルできるはずです。
では、以下のコードはどうでしょうか。

  class Hoge
  {
  public:
    virtual void Func();
  }

  class Foo : public Hoge
  {
  public:
   virtual void Fumc();
  }

間違い探しのようですが、クラス Foo のメンバ関数が Func ではなく Fumc になっています。
単純なスペルミスですね。
しかし、上記のコードにも問題はなく、正しくコンパイルできるはずです。
期待した動作をするかどうかはもうお察しの通りですね。
こういった単純なミスを減らすために、基底クラスの仮想関数をオーバーライドするときは override キーワードを使用することをオススメします。
override キーワードは、派生クラスの該当メンバ関数が「基底クラスの仮想関数をオーバーライドする」と表明するものであり、正しくオーバーライドにならない場合はコンパイルエラーとなります。
override キーワードを使用した場合のコードは以下のようになります。

  class Hoge
  {
  public:
    virtual void Func();
  }

  class Foo : public Hoge
  {
  public:
    virtual void Fumc() override;
  }

上記のコードはコンパイルエラーとなります。
なぜなら基底クラスの仮想関数に Fumc が無いからです。
また、コンパイルエラーなのでプログラム実行以前にバグに気づくことができるという利点もあります。
override キーワードは強制ではないので書かなくても問題はありませんが、バグを事前に防ぐことができるので是非書くことをオススメします。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2017/01/post-5528.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« Mayaのmelスクリプトの書き方 | トップページ | [エクスプレッション]で動きを制御 »

プログラマー」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/217647/64787172

この記事へのトラックバック一覧です: バグを事前に防ごう:

« Mayaのmelスクリプトの書き方 | トップページ | [エクスプレッション]で動きを制御 »