回答編集履歴
2
refinement
test
CHANGED
@@ -10,9 +10,13 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
|
13
|
+
この `override` キーワードは、新しい機能性を提供する(=できることが増えて嬉しい)ものではありません。既存ソースから `override` キーワードを削除してもプログラムの意味自体は全く変化しませんが、ソースコード自身の自己記述能力の向上、将来的な設計変更に対する堅牢性の向上に大きく貢献するものです。
|
14
|
+
|
15
|
+
|
16
|
+
|
13
17
|
----
|
14
18
|
|
15
|
-
下記は、`override` キーワードがあればコンパイルエラーとして早期検知できる
|
19
|
+
下記は、`override` キーワードがあればコンパイルエラーとして早期検知できたシナリオです。説明用サンプルなので大きなメリットには思えないかもしれませんが、ある程度規模の大きいコードベースに対するリファクタリング作業等では大変有用と思います。
|
16
20
|
|
17
21
|
|
18
22
|
|
1
update
test
CHANGED
@@ -7,3 +7,57 @@
|
|
7
7
|
|
8
8
|
|
9
9
|
そもそも `override` キーワードは、プログラマのミスによって「オーバーライド」がうっかり「隠蔽」にならないようにする **安全装置** として導入されました。[cpprefjpサイトの解説](https://cpprefjp.github.io/lang/cpp11/override_final.html) も参照ください。
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
----
|
14
|
+
|
15
|
+
下記は、`override` キーワードがあればコンパイルエラーとして早期検知できる(仮想的な)コードです。
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
```C++
|
20
|
+
|
21
|
+
class Base {
|
22
|
+
|
23
|
+
public:
|
24
|
+
|
25
|
+
// 基底クラスの仮想関数を定義
|
26
|
+
|
27
|
+
virtual void process(int);
|
28
|
+
|
29
|
+
};
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
class Derived: public Base {
|
34
|
+
|
35
|
+
public:
|
36
|
+
|
37
|
+
// 仮想関数を「オーバーライド」したつもり...
|
38
|
+
|
39
|
+
virtual void process(short) /*override*/;
|
40
|
+
|
41
|
+
// 実際には引数パラメータが一致しないので
|
42
|
+
|
43
|
+
// 「隠蔽(hiding)」になってしまっている
|
44
|
+
|
45
|
+
};
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
void func(Base& obj)
|
50
|
+
|
51
|
+
{
|
52
|
+
|
53
|
+
// 引数objに派生クラスDerivedインスタンスが指定された場合、
|
54
|
+
|
55
|
+
// 意図としてはオーバライド先Derived::processが呼ばれてほしい。
|
56
|
+
|
57
|
+
// しかし前述のミスによりBase::processが呼び出されてしまう。
|
58
|
+
|
59
|
+
obj.process(42);
|
60
|
+
|
61
|
+
}
|
62
|
+
|
63
|
+
```
|