継承されるクラスに仮想デストラクタを書かなくてはならない理由として、
よく、ポリモーフィズムを使った場合に、派生クラスのデストラクタが実行されない理由が挙げられる。
"継承 仮想デストラクタ" でググった結果
そうすると、「派生クラスにデストラクタ書かなければ当然仮想デストラクタでなくてもいい」と思いがちだが、
実はそんなことは全然無い。
継承されるクラスに仮想デストラクタを書かなくてはならない理由として、
よく、ポリモーフィズムを使った場合に、派生クラスのデストラクタが実行されない理由が挙げられる。
"継承 仮想デストラクタ" でググった結果
そうすると、「派生クラスにデストラクタ書かなければ当然仮想デストラクタでなくてもいい」と思いがちだが、
実はそんなことは全然無い。
前回突然オーバーライドと隠ぺいの話をしたのは、
今回の話につなげるため。
CDialogResizeは便利だが、
チェインを使ってコレを処理してしまうと、
その後にWM_SIZEの処理をすることができなくなってしまう。
(チェインする前に捕まえて、 bHadled=FALSE
することは可能)
じゃあCDialogResizeを継承して、処理した後にreturnしないようにすればよいのだが、
OnSize関数は仮想関数ではないので、書き換えることができない。
ところが、そのOnSizeを呼んでいるメッセージマップの実態である、
ProcessWindowMessage関数は、(BEGIN_MSG_MAPマクロの中身)
チェインからのみで、CDialogResize内部からは呼ばれていないので、
これを隠ぺいしてしまえば、CDialogResizeのProcessWindowMessageは呼ばれない。
つまり、WM_SIZEを捕まえてもreturnしないProcessWindowMessageを書けばいいのだ。
よくある仮想関数を使ったポリモーフィズム(多様性)の例とは少し違うけど
(複数の種類の派生クラスのアドレスを、親クラスのポインタに代入するやつ)、
メソッドをオーバーライドした場合と、隠ぺいした場合の動作の違いを例示すると、
こんな感じのソースになる。 続きを読む
最近、簡潔さとヘッダだけで動く手軽さ、動作の速さに出力バイナリの小ささから、
ATL/WTLに若干ハマっている。
WM_SIZEを処理するとCDialogResizeが動かないという
初歩的すぎるミスを犯したのでメモメモ。
書くことないというか、ホント正直時間内からなんだが、
ホントどうでもいいことをボソリ。
どんどん砂のように風化していくショボーンのAAが好きなのだが、
これ「さらさらと消えるショボーン」と言うらしい
(´・ω・`)
(´・ω:;.:...
(´:;....::;.:. :::;.. .....
↑これ。
使いたいときにググってもなかなか出てこないのでメモ。
JScriptのString.replaceメソッドは非常に便利だ。
置き換え文字列に、「文字列」ではなく「関数」が使えるところが意外と使える。
"test0 test1".replace(
/\w+(\d)/g,
function($0,$1){return (Number($1)+1).toString();})
てな具合に。
普段はWSHではVBSなんぞ使ったりしないが、
たまにどうしてもVBAやVBSを使わなくてはならない場合がある。
そんなときにそれっぽい動作をする様なのを、
不完全ながら自作してみた。
JScriptで、ダブルクリックしたときにコマンドプロンプトで強制的に起動するとき
こんな感じで起動してやると、
Echoがたくさんあっても大変なことにならず、
しかもエラーコードもしっかり返すことができる。
function CRun(){
if (!(/CSCRIPT\.EXE/i).test(WScript.FullName)){
var WshShell = new ActiveXObject("WScript.Shell");
var strParam = "";
for (var i = 0; i < WScript.Arguments.Count(); i++){
strParam += " \"" + WScript.Arguments(i).replace("\"", "\"\"") + "\"";
}
WScript.Quit(WshShell.Run("cmd.exe /v:on /s /c \"cscript.exe //nologo \""
+ WScript.ScriptFullName + "\""
+ strParam + " & pause & exit /b !ERRORLEVEL!\"", 8, true));
}
}
CRun();
WScript.Echo("CScript!");
WScript.Quit(8);
環境変数の遅延展開をつかって、ERRORLEVELを戻しているのがミソ。
これで、エラーが起きたときの処理もできる。
私は業務を軽減するツールとか作るときに割とよく使う。
昨日一昨日で話題になっていたGoogle PAC-MANが移植されていたので、早速乗っけてみた。
#日付変わっちゃったね
いや、2日間のDoodleのために、これだけのものをJavaScriptで書いてしまうGoogle恐るべしですな。
音はFlashで鳴らしても、描画はJavaScriptで、ってそこまでこだわるか。
うるさい?
知らんがな。