回答編集履歴

6

追記

2018/11/23 23:51

投稿

LouiS0616
LouiS0616

スコア35660

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

追記

2018/11/23 23:51

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -44,7 +44,9 @@
44
44
 
45
45
 
46
46
 
47
+ ---
48
+
47
- もうちょっと明示的な記述が無いのか規格を開いてみたのですが、見つけられませんでした。
49
+ もうちょっと直接的な記述が無いのか規格を開いてみたのですが、見つけられませんでした。
48
50
 
49
51
  非公式なもので良ければ、次のような説明はあります。
50
52
 

4

修正

2018/11/23 16:10

投稿

LouiS0616
LouiS0616

スコア35660

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

追記

2018/11/23 16:09

投稿

LouiS0616
LouiS0616

スコア35660

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

修正

2018/11/23 16:05

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -1,3 +1,13 @@
1
+ 不正確なことを書いてしまったようですので、以下の回答は撤回します。
2
+
3
+ もう少し修正する予定です、しばらくお待ちください。
4
+
5
+
6
+
7
+ 残骸
8
+
9
+ ---
10
+
1
11
  ポインタにしないとメンバを動的に決定してくれません。
2
12
 
3
13
  ```C++

1

追記

2018/11/23 15:29

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -4,18 +4,40 @@
4
4
 
5
5
  int main() {
6
6
 
7
- Parent* child = new Child;
7
+ Parent* obj = new Child;
8
8
 
9
- child->Print();
9
+ obj->Print();
10
10
 
11
11
  cout << endl;
12
12
 
13
13
 
14
14
 
15
- delete child;
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
+ ```