スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【雑談】[追記]C++ のオーバーライド

[追記は一番下]

オーバーライド。
ポリモーフィック(多態性)を実現するためには必須の機能で C++ の機能の一つとなっております。
同じメソッドでもオーバーライドされているかどうかでスーパークラスのメソッドが呼ばれたり
サブクラスのメソッドが呼ばれたりで非常に便利。

オーバーライドを実現するためにはまず virtual キーワードを使用します。

class CBase
{
public:
virtual int GetStatus()const;
};


class CSub : public CBase
{
public:
int GetStatus()const;
};


ステータスを取得するメンバメソッドだったとしましょうか・・・
こうすることで、このクラスを派生したサブクラスではオーバーライドが使用できますね。

CBase *pBase = new CSub;
Status = pBase->GetStatus();

こんな感じで CSub の GetStatus メソッドを呼べる訳ですが、
呼び方をどうするかと言う話ではなくて、オーバーライドの書き方をどうするか?が今回の記事です。

CSub クラスのメンバメソッド int GetStatus()const; ですが、
特に何も記述しなくてもオーバーライドは実現可能です。

ただパッと見、このメンバメソッドはオーバーライドされいる事が解りにくいです。
そこで、こんな記述も可能です。

virtual int GetStatus()const;

CBase クラスと、CSub クラスで同じ書き方です。
前まではこの書き方を採用してました。
なんというかしゃーなしでこれをオーバーライドされてるって言う意味で見ようって事ですね。

しかし、メソッド名を間違えていたり、引数リストが間違っていたとしても問題はなく
ただそういうメソッドがあるんだなくらいにしか取ってくれないので
実際メソッドを呼んだ時に「あれ、挙動が違う」と判断出来ますが、
やっぱり見た目の問題もあって解りにくいです。

個人的に virtual を付ける意味は「派生する可能性がある」場合に付けるべきだと思っています。
なのでこの書き方が凄い嫌いでした。

CSub クラスをパッと見ると
少なくとも自分は派生する可能性のあるクラスなのかなと思ってしまいます。
結局これもスーパークラスから派生されてるのかも解りにくいですがそういうもんだと割り切るしかありませんでした。


そこで C++11 で新しく使えるようになった機能の一つに override というものがあったりします。

int GetStatus()const override;

後ろに override と付けるだけで、あぁオーバーライドされてるなって解りやすいと思います。
(付けるのは CSub クラスのメソッドです)

もしオーバーライドを想定していなかったクラスに対して override を付けてしまうと
コンパイラがエラーを出してくれるので便利です。

error C3668: 'CSub::GetStatus' : オーバーライド指定子 'override' を伴うメソッドは、
基本クラス メソッドをオーバーライドしませんでした


メソッドの名前や引数リストが間違っていてもコンパイルの時点で教えてくれます。
超便利!!


私が使っているコンパイラ VC++ 2008 Express Edition はどうやら使えるようです。
気になる機能が色々登場している C++11。

派生、オーバーロードを禁止する final を使うとコンパイルエラーが出てしまうようで
対応していないのか、書き方が悪いのか解りません。
C++11 に完全に対応したコンパイラが今後出てくるんでしょうか・・・。


VC++2010 では使えるんでしょうかね・・・。
まぁ使えますと言っても C++03 では使用できないと思うので使うかどうかは微妙なところですが
こういう解りやすい書き方は使っていきたいですね。

せっかくなので重たいと言われている VC++2010 をインストールしてきますか~
もし記述出来たら追記にでも書きます。



[--- 追記 ---]
VC++ 2010 Express Edition をインストールしてきました。

2008 では int GetStatus()const override; この記述はOKでしたが
2010 ではエラーが出ます。

error C2217: 'override' には 'virtual' が必要です

virtual キーワードの使用を求められるようです。
なので、 virtual int GetStatus()const override; が正しい書き方になるようです。
エラーが出るならしょうがないですね・・・。
こっちに書き方を合わせようと思います。


C++11 の新機能はこんなコンパイラで使えますっていう表を発見。
ありがたい。

http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx

ふむふむ・・・
使えるコンパイラも有るようで、VC 2008に関してはアウツと言う事ですね。
残念ではありますが、使えないよりも、VC11 とか出てたんや!って方が驚きが強かったですww
VC++ 2011 EE はまだないようなのでリリースされる日を楽しみに待つ事にします。

製品版はあるそうなのでそっちを買えば使えるようですね。
ま、買いませんけどね!

せっかく VC++ 2010 EE をインストールしたので
VC++ 2008 EE では互換性がないとか言われてインストールできなかったSP1。
VC++ 2010 EE では、std::shared_ptr が使えつようになっているので
試しに使ってみたいなと思います。


今は四分木の空間分割を扱うためにクラスを構築している段階です。
やるだけやってパフォーマンス変わるか実験したいです。

この記事へのコメント

- Egtra - 2012年07月20日 23:59:04

VC11はまだですよ。Visual C++ 2012として今年には出るのではないかと思います。RC版が現在公開されています。もちろん、Expressもある(Visual Studio 2012 Express for Windows Desktop)と発表されています。

- DVDM♪管理人♪ - 2012年07月21日 01:17:57

>> Egtra さん
コメントありがとうございます。

> VC11はまだですよ。
Visual Studio LightSwitch 2011 というのが 2011 の製品なんでしょうかね…。
フリーのコンパイラに頼ってばっかりなので 2011 の Express Edition が出ないかなと思いましたが、
そう言えば Express Edition は、2008 の次が2010で間の2009はありませんでしたね…

> Visual Studio 2012 Express for Windows Desktop
C++, C#, VB をサポートするそうなので、
もしリリースされたら一回使ってみたいです。

C++11 の機能をこのコンパイラで使えるのかどうかは解らないですが、
2010 と同じく .NET Framework を挟む形になるなら同じく重たいかもしれませんね~;
VC++ 2010 以降のコンパイラを知らなかったので
いい情報を教えて頂けまして大変嬉しいです!
ありがとうございます♪

- Egtra - 2012年07月22日 01:15:40

> C++11 の機能をこのコンパイラで使えるのかどうかは解らないですが、
それが本文中に触れられていたこのウェブページに書いてあるというわけです。VC11の正式名称がVisual C++ 2012になります。
http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx

- DVDM♪管理人♪ - 2012年07月22日 13:24:23

>> Egtra さん
> Visual C++ 2012として今年には出るのではないかと思います。
なるほど、これはそう言う意味だったのですね。
次のバージョンを楽しみに待っておく事にします!

トラックバック

URL :

検索フォーム
プロフィール

DVDM

Author:DVDM
自作ゲームの開発過程ブログ。
赤髪愛なら誰にも負けない。

 
Pixiv バナー


ブロとも申請フォーム
最新記事
カテゴリ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
ブロとも一覧
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。