C++0x: [[final]] Attribute

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先生。

http://groups.google.com/group/comp.std.c++/browse_thread/thread/67c7aeb6e8e0bcad/ddba4f2a5fe876a6?show_docid=ddba4f2a5fe876a6

先生驚愕して曰く、「どうして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 コメント: