プログラミングメモ - 寝言はいいからデストラクタに virtual はつけといた方がいいよ

2010/11/10

なんとなくこちらから。いじわるな発言もあるので,ここでもいじわる気味に書いておきます。

【募集】 C++で「デストラクタには、どんな場合でもvirtual付けとけ」という意見に対する反論。将来のためとはいえ、デメリットは何もないのかしら?何かのコスト増とか。

vftable を検索するコストとかリンカのほげほげとかいった話があるんだけれども,そんなこと心配しなくても,あなたのプログラムのボトルネックはそんなシビアなところには表れないから大丈夫。もっと他に最適化すべきところがあるでしょ,と。また,オブジェクトの中身をポインタでいぢるなんてのは問題外。C++ の入門本でこれでもかというほど「やっちゃいけない」と書いてあることなので,C++ 初心者さんということで。

で,「継承させる予定がなければ virtual をつけない」な話なんですけれど(「『今はよく分からんけど継承されるかも♪』というのはそもそも設計面で考慮が足りない」),こゆ考え方は,とてもローカルな開発環境でやってる人にしか言えないと思うんですよ。趣味プログラミングとか,研究室のプログラムとか,社内でローカルなライブラリとか。使い手を信用しすぎているつかね。

そもそも(というのもアレなんだが),オブジェクト指向を標榜して作られたクラスは,プログラム部品として高い独立性を持っている必要があります。このプログラムからしか使われないクラスだから,みたいな理屈は基本的には通らない。公開されているクラスである以上,「使える機能は使って良い」を意味しているわけで,継承禁止なんていくらコメントを書いたところで,使えるようにしか使われない。そう使う人間を「初心者」なり「残念なプログラマ」(ブコメ参照)なりと評すのは自由だけれども,結局そのプログラムは事実として継承して使われるし,継承できるように書いたのは外でもないあなただったりする。

この理屈は,一般的なエンドユーザを相手にしたときでも言えます。「こんな使われ方は想定していなかった!だからユーザがバカで残念な人なんだ」なんて理屈は通らない。驕ったプログラマはカコワルイぞ。

あたしゃ普段,製品としてクラスライブラリを作っていたりするんですけれど,どんな使われ方をしても必ず設計上の制御(想定)の下に置いておけることに細心の注意を払っていたりします。だから,正直上の議論には驚いた。どれだけ「オレ様」なんだよ,と。こゆ人は,C++ やっても Java やっても同じこと言うんだろうな。想定しない使われ方で人が死んだり,交通が麻痺したり,金融が混乱したりしたとして,「想定しない使われ方が原因だ!」とか言ったところで意味がない。それでも「オレ様」でいられるなら,大したもんだけど。ま,寝言はともかく,virtual つけとけよ,と。

Site Navigation
SNS Accounts (@aian)

普段はここら辺に住んでいます.