teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

追記

2018/11/23 23:51

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -22,12 +22,14 @@
22
22
  基底クラスの領域を解放するために、デストラクタを呼んでいるようです。
23
23
 
24
24
  ---
25
- もうちょっと直接的な記述が無いのか規格を開いてみたのですが、見つけられませんでした。
25
+ もうちょっと直接的な記述が無いのか規格を開いてみたのですが、見つけられませんでした。
26
26
  非公式なもので良ければ、次のような説明はあります。
27
27
  > 派生クラスのコンストラクタを呼ぶ前に基底クラスのコンストラクタが呼ばれ、派生クラスのデストラクタが呼ばれた後に基底クラスのデストラクタが呼ばれるのです。
28
28
 
29
29
  引用元: [ロベールのC++教室 - 第16章 派生と構築 -](http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02016.html)
30
30
 
31
+ ※ 私の調査不足でした。asmさんとyumetodoさんのコメントをご覧ください。
32
+
31
33
  ---
32
34
  不正確なことを書いてしまったようですので、以下の回答は撤回します。
33
35
 

5

追記

2018/11/23 23:51

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -21,7 +21,8 @@
21
21
 
22
22
  基底クラスの領域を解放するために、デストラクタを呼んでいるようです。
23
23
 
24
+ ---
24
- もうちょっと明示的な記述が無いのか規格を開いてみたのですが、見つけられませんでした。
25
+ もうちょっと直接的な記述が無いのか規格を開いてみたのですが、見つけられませんでした。
25
26
  非公式なもので良ければ、次のような説明はあります。
26
27
  > 派生クラスのコンストラクタを呼ぶ前に基底クラスのコンストラクタが呼ばれ、派生クラスのデストラクタが呼ばれた後に基底クラスのデストラクタが呼ばれるのです。
27
28
 

4

修正

2018/11/23 16:10

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -19,11 +19,16 @@
19
19
  > }
20
20
  > ```
21
21
 
22
- 基底クラスの領域を解放するに、基底クラスのデストラクタばれるようです。
22
+ 基底クラスの領域を解放するために、デストラクタんでいるようです。
23
23
 
24
+ もうちょっと明示的な記述が無いのか規格を開いてみたのですが、見つけられませんでした。
25
+ 非公式なもので良ければ、次のような説明はあります。
26
+ > 派生クラスのコンストラクタを呼ぶ前に基底クラスのコンストラクタが呼ばれ、派生クラスのデストラクタが呼ばれた後に基底クラスのデストラクタが呼ばれるのです。
27
+
28
+ 引用元: [ロベールのC++教室 - 第16章 派生と構築 -](http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02016.html)
29
+
24
30
  ---
25
31
  不正確なことを書いてしまったようですので、以下の回答は撤回します。
26
- もう少し修正する予定です、しばらくお待ちください。
27
32
 
28
33
  残骸
29
34
  ---

3

追記

2018/11/23 16:09

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,3 +1,27 @@
1
+ [cppreference.com - virtual function specifier](https://en.cppreference.com/w/cpp/language/virtual)には、次のようなサンプルがあります。
2
+ > ```C++
3
+ > class Base {
4
+ > public:
5
+ > virtual ~Base() { /* releases Base's resources */ }
6
+ > };
7
+
8
+ > class Derived : public Base {
9
+ > ~Derived() { /* releases Derived's resources */ }
10
+ > };
11
+
12
+ > int main()
13
+ > {
14
+ > Base* b = new Derived;
15
+ > delete b; // Makes a virtual function call to Base::~Base()
16
+ > // since it is virtual, it calls Derived::~Derived() which can
17
+ > // release resources of the derived class, and then calls
18
+ > // Base::~Base() following the usual order of destruction
19
+ > }
20
+ > ```
21
+
22
+ 基底クラスの領域を解放する際に、基底クラスのデストラクタが呼ばれるようです。
23
+
24
+ ---
1
25
  不正確なことを書いてしまったようですので、以下の回答は撤回します。
2
26
  もう少し修正する予定です、しばらくお待ちください。
3
27
 

2

修正

2018/11/23 16:05

投稿

LouiS0616
LouiS0616

スコア35678

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

1

追記

2018/11/23 15:29

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,11 +1,22 @@
1
1
  ポインタにしないとメンバを動的に決定してくれません。
2
2
  ```C++
3
3
  int main() {
4
- Parent* child = new Child;
4
+ Parent* obj = new Child;
5
- child->Print();
5
+ obj->Print();
6
6
  cout << endl;
7
7
 
8
- delete child;
8
+ delete obj;
9
9
  return 0;
10
10
  }
11
+ ```
12
+
13
+ メモリリークを回避するために、スマートポインタを使うとさらに良いでしょう。
14
+ ```C++
15
+ int main() {
16
+ auto obj = std::make_unique<Child>();
17
+ obj->Print();
18
+ cout << endl;
19
+
20
+ return 0;
21
+ }
11
22
  ```