最近cpprefjp(リンクはこちら)のコミット権をいただいたので、小物ネタから書いてはコントリビュートしていますが、一見簡単そうに見えたC++11のoverrideとfinalの経緯を調べていたら、土日が終わってしまいました。
実はoverrideとfinalは簡単ですが、同時に検討されていたhidingが鬼門でした…。
以下の例のように「間違って基底クラスの仮想メンバ関数を隠した(hiding)ときエラーにしたい」という提案から始まりました。
class A {
virtual void func();
};
// check hiding and override
class B explicit : public A {
// NG, 間違ってA::func() を隠していないか?
void func(int a);
// OK, あえてA::func() を隠すと宣言している
void func(double b) new;
};
でも事はそう単純ではありませんでした。overrideはメンバ関数同士でしか発生しませんが、hidingはメンバ関数とメンバ関数以外でも発生するため、考慮するケースが多いからです。
C++ 標準化委員会のペーパーには、問題となる例が挙げられていますが、あえて私見で「あ、これダメだ」と思ったヤツを1つ挙げると、以下の例です。
class A {
virtual void N();
};
class B explicit : public A {
// B::NはA::N() を隠すからnewを宣言すべき、でもnewを書く文法は?
enum { N };
};
初見の方はnewを使い回すなよと思うでしょう。実際、最初はhidingという名前で提案されました。しかし問題がありました。
struct A {};
struct B {
// これは構造体の宣言?変数の宣言?
struct A hiding;
};
これらの問題を回避するためにenumの中のNやらMやらにまで、一々newと書く文法を新たに作るのも、不細工極まりないです。
他にもusing、多重継承など、かなり広範に渡ってhidingが起きるため、これはダメだと判断されたようでexplicitとnew (hidingを宣言するための) は、C++11策定の最後辺りでDrop されました。
C++14にも採用されていないように見えるけど、次のC++ 規格で入るのかな…??
メモ: 技術系の話はFacebookから転記しておくことにした。
あなたのチームの「いい人」は機能していますか? - SlideShareを読んで。
会社で「システム班」と呼ばれた人たちがほぼ全員辞めていった理由が全て書いてありました。
私もここ1年くらいWikiやRedmineで「情報の抱え込みをやめて、共有する文化」の普及に挑戦しましたが、挫折気味です。
やってくれる人は言ったその日から継続的にやってくれるのですが、やってくれないオジサン達って「共有は大事」と言いつつ、三日坊主orガン無視するんですよね…。
どうしたら良いんだろね?
メモ: 技術系の話はFacebookから転記しておくことにした。
< | 2016 | > | ||||
<< | < | 02 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | - | - | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)