2017-09-11 10 views
0

私は説明できない奇妙な状況を発見しました。私は親クラスと基本クラスを持っています。親クラスのコンストラクタでは、ローカルオブジェクトを定義します(これは複雑なCの装置です - XMLパーサとプロセッサと考える)。その後、子クラスを作成しましたが、子クラスのコンストラクタでは、親コンストラクタを呼び出すことを完全に忘れてしまいました。その結果、プログラムが実行され、すべてのものがうまくいくように見えます。子クラスはすべての親クラス操作を呼び出し、プログラムがひどくクラッシュするまで(カーネルレベルのパニックについて話す)、すべてがうまくいくように見えます。これがクラッシュの原因であるかどうかはまだ分かりませんが、それが原因かもしれません。親コンストラクタを呼び出さずにビルドして実行するC++クラス

これがどのように機能しているかを理解しようとしています(おそらくポイントまで)。メモリがローカルオブジェクトに関して並んでいるので、私は非常にばかげて馬鹿げた幸運なことですか?

「複雑なオブジェクトは、」デフォルトコンストラクタは、どんな初期化されないことになるだろうしている場合、私は

// header 
class ParentClass 
{ 
    private: 
     OtherClass _complexObject; 
    protected: 
    public: 
     ParentClass(); 
     virtual ~ParentClass(); 
     virtual void AddData(OtherClass *complexObject); 
     virtual void DoStuff(); 
} 

class ChildClass: public ParentClass 
{ 
    private: 
    protected: 
    public: 
     ChildClass(); 
     virtual ~ChildClass(); 
} 

//source 
ParentClass::ParentClass() 
{ 
    _complexObject = create_complex_object(); 
} 
ParentClass::~ParentClass(){} 
void ParentClass::AddData(OtherClass *complexObject) 
{ 
    add_data_to_object(complexObject, 12345); 
} 
void ParentClass::DoStuff() 
{ 
    AddData(_complexObject); 
} 


BaseClass::BaseClass(){} 
BaseClass::~BaseClass(){} 

// at some point, BaseClass::DoStuff() is called... 
+0

子どもは、明示的にしないと、デフォルトのctorで両親を初期化します。 – AndyG

+0

これらの "BaseClass"定義は、ChildClassの一番下の誤植ですか?とにかく@AndyGは正しいですが、あなたはParentClassのコンストラクタに出力を入れて、それを見て見ることができます。実際にParentClassのコンストラクタをprivateにすると、コードはコンパイルされません。 XMLパーサ/プロセッサがカーネルパニックを引き起こす可能性は非常に低いです。 – Kevin

答えて

2

それから私は、子クラスを作成しますが、子クラスのコンストラクタで、私は完全に親のコンストラクタを呼び出すために忘れてしまいました。 C++言語は、階層内のオブジェクトが初期化されることが保証されますので、これは動作し、コンパイル

理由があります。この場合、コンパイラは、派生した(あなたの言葉では "子")クラスがベース( "親")コンストラクタを呼び出さないと見ています...コンパイラがそれを行います。今、基本クラスにアクセス可能なデフォルトのコンストラクタ(引数を取らないコンストラクタ)がある場合にのみこれを行うことができます。これもここでもそうです。

基本クラスにデフォルトのコンストラクタがない場合(つまり、引数を必要とするコンストラクタしかない場合)、コンパイラは自分自身で何をすべきかを知らず、コンパイルエラーです。

0

何を意味するかを確認するために、簡略化の定義を見てみましょう。たぶん、あなたは基本的に "ガベージ"を持っている変数を使用しているラインの下にそれはあなたの問題を引き起こしている。

+0

何を言いますか?あなたの声明を明確にしてください。 – JHBonarius

+0

@Matt Gallantはあなたにもっと堅牢な答えを与えました。 – InusualZ

+0

私は答えは必要ありませんでした。私はあなたの投稿の質についてコメントしていました。 – JHBonarius

関連する問題