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

回答編集履歴

1

追記

2017/04/04 02:37

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -6,4 +6,6 @@
6
6
  };
7
7
  ```
8
8
  C++ではこのような書き方をしてはいけません。
9
- 仮想関数テーブルは、コンストラクタ実行時に設定されるのですが、設定するのは宣言中のクラス(上記コードでいえばAbstractクラス)の物なので、その時点では純粋仮想関数はまだ実体が定義されていません。したがって、上記コードのinitialize関数呼び出しは、実体のない関数への呼び出しとなり、実行時に例外が発生して強制終了するか、コンパイラーによってはリンクエラーとなります。
9
+ 仮想関数テーブルは、コンストラクタ実行時に設定されるのですが、設定するのは宣言中のクラス(上記コードでいえばAbstractクラス)の物なので、その時点では純粋仮想関数はまだ実体が定義されていません。したがって、上記コードのinitialize関数呼び出しは、実体のない関数への呼び出しとなり、実行時に例外が発生して強制終了するか、コンパイラーによってはリンクエラーとなります。
10
+
11
+ ちなみに、仮想関数テーブルはデストラクタ実行時も宣言中のクラスの物に設定されます(戻されます)。したがって、コンストラクタやデストラクタでは、純粋仮想関数に限らず仮想関数呼び出しは行うべきではありません。