回答編集履歴
6
追記
test
CHANGED
@@ -46,7 +46,7 @@
|
|
46
46
|
|
47
47
|
---
|
48
48
|
|
49
|
-
もうちょっと直接的な記述が無いのか規格を開いてみたのですが、見つけられませんでした。
|
49
|
+
もうちょっと直接的な記述が無いのか規格を開いてみたのですが、見つけられませんでした。 ※
|
50
50
|
|
51
51
|
非公式なもので良ければ、次のような説明はあります。
|
52
52
|
|
@@ -55,6 +55,10 @@
|
|
55
55
|
|
56
56
|
|
57
57
|
引用元: [ロベールのC++教室 - 第16章 派生と構築 -](http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02016.html)
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
※ 私の調査不足でした。asmさんとyumetodoさんのコメントをご覧ください。
|
58
62
|
|
59
63
|
|
60
64
|
|
5
追記
test
CHANGED
@@ -44,7 +44,9 @@
|
|
44
44
|
|
45
45
|
|
46
46
|
|
47
|
+
---
|
48
|
+
|
47
|
-
もうちょっと
|
49
|
+
もうちょっと直接的な記述が無いのか規格を開いてみたのですが、見つけられませんでした。
|
48
50
|
|
49
51
|
非公式なもので良ければ、次のような説明はあります。
|
50
52
|
|
4
修正
test
CHANGED
@@ -40,15 +40,25 @@
|
|
40
40
|
|
41
41
|
|
42
42
|
|
43
|
-
基底クラスの領域を解放する
|
43
|
+
基底クラスの領域を解放するために、デストラクタを呼んでいるようです。
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
もうちょっと明示的な記述が無いのか規格を開いてみたのですが、見つけられませんでした。
|
48
|
+
|
49
|
+
非公式なもので良ければ、次のような説明はあります。
|
50
|
+
|
51
|
+
> 派生クラスのコンストラクタを呼ぶ前に基底クラスのコンストラクタが呼ばれ、派生クラスのデストラクタが呼ばれた後に基底クラスのデストラクタが呼ばれるのです。
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
引用元: [ロベールのC++教室 - 第16章 派生と構築 -](http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02016.html)
|
44
56
|
|
45
57
|
|
46
58
|
|
47
59
|
---
|
48
60
|
|
49
61
|
不正確なことを書いてしまったようですので、以下の回答は撤回します。
|
50
|
-
|
51
|
-
もう少し修正する予定です、しばらくお待ちください。
|
52
62
|
|
53
63
|
|
54
64
|
|
3
追記
test
CHANGED
@@ -1,3 +1,51 @@
|
|
1
|
+
[cppreference.com - virtual function specifier](https://en.cppreference.com/w/cpp/language/virtual)には、次のようなサンプルがあります。
|
2
|
+
|
3
|
+
> ```C++
|
4
|
+
|
5
|
+
> class Base {
|
6
|
+
|
7
|
+
> public:
|
8
|
+
|
9
|
+
> virtual ~Base() { /* releases Base's resources */ }
|
10
|
+
|
11
|
+
> };
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
> class Derived : public Base {
|
16
|
+
|
17
|
+
> ~Derived() { /* releases Derived's resources */ }
|
18
|
+
|
19
|
+
> };
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
> int main()
|
24
|
+
|
25
|
+
> {
|
26
|
+
|
27
|
+
> Base* b = new Derived;
|
28
|
+
|
29
|
+
> delete b; // Makes a virtual function call to Base::~Base()
|
30
|
+
|
31
|
+
> // since it is virtual, it calls Derived::~Derived() which can
|
32
|
+
|
33
|
+
> // release resources of the derived class, and then calls
|
34
|
+
|
35
|
+
> // Base::~Base() following the usual order of destruction
|
36
|
+
|
37
|
+
> }
|
38
|
+
|
39
|
+
> ```
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
基底クラスの領域を解放する際に、基底クラスのデストラクタが呼ばれるようです。
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
---
|
48
|
+
|
1
49
|
不正確なことを書いてしまったようですので、以下の回答は撤回します。
|
2
50
|
|
3
51
|
もう少し修正する予定です、しばらくお待ちください。
|
2
修正
test
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
不正確なことを書いてしまったようですので、以下の回答は撤回します。
|
2
|
+
|
3
|
+
もう少し修正する予定です、しばらくお待ちください。
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
残骸
|
8
|
+
|
9
|
+
---
|
10
|
+
|
1
11
|
ポインタにしないとメンバを動的に決定してくれません。
|
2
12
|
|
3
13
|
```C++
|
1
追記
test
CHANGED
@@ -4,18 +4,40 @@
|
|
4
4
|
|
5
5
|
int main() {
|
6
6
|
|
7
|
-
Parent*
|
7
|
+
Parent* obj = new Child;
|
8
8
|
|
9
|
-
|
9
|
+
obj->Print();
|
10
10
|
|
11
11
|
cout << endl;
|
12
12
|
|
13
13
|
|
14
14
|
|
15
|
-
delete
|
15
|
+
delete obj;
|
16
16
|
|
17
17
|
return 0;
|
18
18
|
|
19
19
|
}
|
20
20
|
|
21
21
|
```
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
メモリリークを回避するために、スマートポインタを使うとさらに良いでしょう。
|
26
|
+
|
27
|
+
```C++
|
28
|
+
|
29
|
+
int main() {
|
30
|
+
|
31
|
+
auto obj = std::make_unique<Child>();
|
32
|
+
|
33
|
+
obj->Print();
|
34
|
+
|
35
|
+
cout << endl;
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
return 0;
|
40
|
+
|
41
|
+
}
|
42
|
+
|
43
|
+
```
|