回答編集履歴

1

追記

2016/05/31 09:29

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -21,3 +21,63 @@
21
21
 
22
22
 
23
23
  また、オーバーライドも2種類あります。仮想関数をオーバーライドする場合と通常の関数をオーバーライドする場合ですね。後者はコンパイル時に解決されます。そして、前者を動的と言って良いのかどうかちょっと微妙に感じます。vtableはコンパイル時に生成されます。vtableへのポインタはコンストラクト時に設定されますが、その時は派生クラスがコンストラクトされています。
24
+
25
+
26
+
27
+ ---
28
+
29
+ 【追記】
30
+
31
+ すいません。std::string::operator+()は存在してませんでした。
32
+
33
+ 代わりに、virutalなしでもオーバーライドできることをstd::string::operator+=()で確認しました。
34
+
35
+
36
+
37
+ ```C++
38
+
39
+ #include<iostream>
40
+
41
+ #include<string>
42
+
43
+
44
+
45
+ class my_string : public std::string
46
+
47
+ {
48
+
49
+ public:
50
+
51
+ my_string(const char* s) : std::string(s) { }
52
+
53
+ my_string& operator+=(const char* s)
54
+
55
+ {
56
+
57
+ std::string::operator+=(s);
58
+
59
+ return *this;
60
+
61
+ }
62
+
63
+ };
64
+
65
+
66
+
67
+ int main()
68
+
69
+ {
70
+
71
+ my_string x("abc");
72
+
73
+ x += "+def";
74
+
75
+ std::cout << x << "\n";
76
+
77
+ return 0;
78
+
79
+ }
80
+
81
+ ```
82
+
83
+ MinGW(gcc) 5.2.0とmsvc 2015でビルドと動作確認してます。