|
コンストラクタとデストラクタは継承されない
- 基本クラスにコンストラクタやデストラクタが定義されていても、
それらは派生クラスに継承されない
- MyClass クラスを継承し、NewClass クラスを定義すると...
- MyClass クラスのコンストラクタは MyClass()
- MyClass クラスのデストラクタは ~MyClass()
- そんな名前のメンバを継承しても意味が無い
- NewClass クラスのコンストラクタは NewClass()、
デストラクタは ~NewClass() という名前でなけらばならない
- 継承はされないが、自動的に呼び出される
- NewClass クラスのオブジェクトを作成時に、NewClass のコンストラクタと、
MyClass のコンストラクタが呼び出される
- NewClass クラスのオブジェクトをメモリから破棄される時に、NewClass のデストラクタと、
MyClass のデストラクタが呼び出される
- 確認サンプル(実行順序)
-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
-
|
-
|
!
-
|
!
!
-
|
-
|
!
-
|
!
!
-
|
|
|
|
|
!
| #include <stdio.h>
class MyClass
{
public:
MyClass() {
printf ("MyClass のコンストラクタ実行\n");
}
~MyClass() {
printf ("MyClass のデストラクタ実行\n");
}
};
class NewClass : public MyClass
{
public:
MyClass() {
printf ("NewClass のコンストラクタ実行\n");
}
~MyClass() {
printf ("NewClass のデストラクタ実行\n");
}
};
main ()
{
NewClass obj;
printf ("***** main *****\n");
return 0;
}
|
- 実行結果
MyClass のコンストラクタ実行
NewClass のコンストラクタ実行
***** main *****
NewClass のデストラクタ実行
MyClass のデストラクタ実行
引数を持つコンストラクタの呼び出し
- 1つのクラスに定義できるデストラクタは1つだけ
- 従って、派生クラスのデストラクタと基本クラスのデストラクタは1対1で対応する
- 基本クラスがオーバーロードされた複数のコンストラクタを持っている場合は、
どれを呼び出すか指定しなければならない
- 確認サンプル(実行順序)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
-
|
-
|
!
-
|
!
-
|
!
!
-
|
-
|
!
-
|
!
!
-
|
|
|
|
|
!
| #include <stdio.h>
class MyClass
{
public:
MyClass() {
printf ("MyClass のコンストラクタ実行\n");
}
MyClass(int m) {
printf ("MyClass(int %d) のコンストラクタ実行\n", m);
}
~MyClass() {
printf ("MyClass のデストラクタ実行\n");
}
};
class NewClass : public MyClass
{
public:
MyClass(int m) : MyClass(m) {
printf ("NewClass のコンストラクタ実行\n");
}
~MyClass() {
printf ("NewClass のデストラクタ実行\n");
}
};
main ()
{
NewClass obj(1);
printf ("***** main *****\n");
return 0;
}
|
- 実行結果
MyClass のコンストラクタ実行
MyClass(int 1) のコンストラクタ実行
***** main *****
NewClass のデストラクタ実行
MyClass のデストラクタ実行
参考
|
|