2月23日(2009)


コンストラクタの中でコンストラクタ呼んだら…

まずは以下を見て欲しい

public class DmyBase
{
   public:
      DmyBase(void){ printf( "DmyBase called...\n" ); };
};
public class DmyChild : DmyBase
{
   public:
      DmyChild(void){ printf( "DmyChild(void) called...\n" ), DmyChild(0); };
      DmyChild(int _a){ printf( "DmyChild(int _a) called...\n" ); };
};

…こんな感じで、DmyChild()という形のコンストラクタが呼ばれたら、内部でDmyChild(0)を
呼ぶという、オーバーロードを使って楽しちゃおう的な感覚で書いたコード。

しかし、これを出力すると次のようになる

DmyBase called...
DmyChild(void) called...
DmyBase called...
DmyChild(int _a) called...

DmyBaseが2度呼ばれちゃってる!!
要するにコンストラクタが親クラスのコンストラクタを呼び出すという手順になっている。
今までずっと、

インスタンス生成 ⇒ 親クラスのコンストラクタ ⇒ 子クラスのコンストラクタ

かと思ってて、コンストラクタは単に最初にコールされる関数でしかないとしか思っていなかった。
なのでコンストラクタ内でコンストラクタをコールしても問題ないだろうと…。

一番問題になりそうなのが親クラスでメモリ確保とかしちゃってると目も当てられない。
注意しよう…。
最終更新:2009年02月23日 13:45
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。