C++0xのドラフトの中で、[[final]] 属性は下記のように定義されているそうです。
The [final] attribute applies to class definitions and to virtual member functions being declared in a class definition. If the attribute is specified for a class definition, it is equivalent to being specified for each virtual member function of that class, including inherited member functions.
If a virtual member function f in some class B is marked final and in a class D derived from B, a function D::f overrides B::f, the program is ill-formed; no diagnostic required.
やる気ない意訳:
[final]属性をつけたクラスとは、すべての仮想メンバ関数に[final]が付いてるのと同じです。
で、[final]属性つき仮想メンバ関数をオーバーライドするのは不適(ill-formed)です。
#豪快に省いている。後悔はしていない。
・・・ん?んんんん?
[final]クラスって継承禁止じゃないの?
というところを突っ込んだのがMeyers先生。
先生驚愕して曰く、「どうしてJavaのfinalとこんなに意味が違うのか。説明せよ。」
む。今日の今日まで私もfinalクラスは"継承禁止"とばかり思っていました。
#仕様はこのMLみるまで知らなかった。今では反省している。
これに対するお答え。
Mathias Gaunard氏曰く、「継承はオーバーライド以外のネタにも使う。そこまでシバくと困る。」
"オーバーライド以外のネタ"とは、氏によると"strong typedef"と"EBO"とかだそうです。
#strong typedefはともかく、EBOが働く基底を[[final]]にする意味がわかりません。オシエテエロイヒト。
Nick Hounsome氏曰く、「Javaとは違うのだよJavaとは!」
「継承までシバいたらprotectedメンバやら変数やらに触れなくなって困る。そこら辺を何とかする方法がないと。」
で、Meyers大先生曰く、「そんな誤解しやすい名前じゃなくて別の名前にすべきではないか。でないとみんな混乱する。」
ん。そのギセイシャがここに少なくとも一人。
#ま、まぁJavaは"なでる程度"しか触ってないですが。
Sean Hunt氏曰く、「Javaのfinalって良いことなにもな(ゲフンゲフン)」
あなたは私ですか。
finalが別のところで市民権を得ているトコからすると、挙動をそろえるのが筋。
さもなくばリネームしたほうがいいというMeyers超先生(IMEがえらい変換しおった・・・)のご意見に今のところ一票。
#でも[all_final]ってのはちょっとイタダケナイ。
0 コメント:
コメントを投稿