Top > C++言語 > 継承(コンストラクタ・デストラクタ)


コンストラクタとデストラクタは継承されない

  • 基本クラスにコンストラクタやデストラクタが定義されていても、
    それらは派生クラスに継承されない
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 のデストラクタ実行


参考


リロード   凍結解除 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Mon, 03 Jun 2019 14:37:49 UTC (1781d)