- PR -

[C++][MFC] 継承できないOnClose

1
投稿者投稿内容
Sampo
会議室デビュー日: 2008/07/03
投稿数: 18
投稿日時: 2009-03-23 15:32
VC2008でC++とMFCプログラミングを学習中です。

ウィンドウイベントの拾い方について理解できずにいるところがあるのですが、
CDialogやCWndのOnClose()関数がvirtualなしで宣言されているのはなぜでしょう?

仮想関数でないということはオーバーライドできないということで、継承したクラスでOnClose()を書いても別関数扱い、イベントでは呼ばれない、という解釈でいいのですよね?
(実際、自分で試しても呼ばれませんし。)

OnClose()という関数は作ればイベントを拾ってくれるというものではなく、自分でWindowProc()でイベントを拾うべきものなのでしょうか?

その場合、OnClose()という関数は何のためにあるのでしょうか?
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2009-03-23 15:55
引用:

Sampoさんの書き込み (2009-03-23 15:32) より:
ウィンドウイベントの拾い方について理解できずにいるところがあるのですが、
CDialogやCWndのOnClose()関数がvirtualなしで宣言されているのはなぜでしょう?



MFCではメッセージマップ機能を使ってイベント処理するからです。
テクニカル ノート 6: メッセージ マップ(msdn)

リンク先の「問題」のところにも触れていますが、
多数のメッセージ対してウィンドウクラスに仮想関数を用意してしまうと、
仮想関数テーブル(vtable)が肥大化し過ぎてしまうから、敢えて使ってないのです。

引用:

仮想関数でないということはオーバーライドできないということで、継承したクラスでOnClose()を書いても別関数扱い、イベントでは呼ばれない、という解釈でいいのですよね?
(実際、自分で試しても呼ばれませんし。)


はい、そうです。継承先に単に同名のメソッドを書いただけでは呼び出されません。


引用:

OnClose()という関数は作ればイベントを拾ってくれるというものではなく、自分でWindowProc()でイベントを拾うべきものなのでしょうか?
その場合、OnClose()という関数は何のためにあるのでしょうか?


書籍やネットでまずMFCとメッセージマップについて勉強してください。

DECLARE_MESSAGE_MAP マクロ
BEGIN_MESSAGE_MAP マクロ
END_MESSAGE_MAP マクロ
ON_WM_CLOSE

Sampo
会議室デビュー日: 2008/07/03
投稿数: 18
投稿日時: 2009-03-23 16:10
大事なキーワードをありがとうございます。
おかげさまで理解できました。
1

スキルアップ/キャリアアップ(JOB@IT)