私は説明できない奇妙な状況を発見しました。私は親クラスと基本クラスを持っています。親クラスのコンストラクタでは、ローカルオブジェクトを定義します(これは複雑な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...
子どもは、明示的にしないと、デフォルトのctorで両親を初期化します。 – AndyG
これらの "BaseClass"定義は、ChildClassの一番下の誤植ですか?とにかく@AndyGは正しいですが、あなたはParentClassのコンストラクタに出力を入れて、それを見て見ることができます。実際にParentClassのコンストラクタをprivateにすると、コードはコンパイルされません。 XMLパーサ/プロセッサがカーネルパニックを引き起こす可能性は非常に低いです。 – Kevin