C++ デストラクタの動作について質問がありましたが、何よりも好奇心からでした。私は次のクラスを持っています:
Base.h
class BaseB;
class BaseA
{
public:
virtual int MethodA(BaseB *param1) = 0;
};
class BaseB
{
};
Imp.h
#include "Base.h"
#include <string>
class BImp;
class AImp : public BaseA
{
public:
AImp();
virtual ~AImp();
private:
AImp(const AImp&);
AImp& operator= (const AImp&);
public:
int MethodA(BaseB *param1) { return MethodA(reinterpret_cast<BImp *>(param1)); }
private:
int MethodA(BImp *param1);
};
class BImp : public BaseB
{
public:
BImp(std::string data1, std::string data2) : m_data1(data1), m_data2(data2) { }
~BImp();
std::string m_data1;
std::string m_data2;
private:
BImp();
BImp(const BImp&);
BImp& operator= (const BImp&);
};
問題は、このコードではすべてが問題なく動作することです。しかし、AImp::MethodA の呼び出しで BImp 仮想のデストラクタを作成すると、クラス BImp のデータ (m_data1 および m_data2) が初期化されていないように見えます。構築時に含まれているデータが正しいことを確認したので、これの背後にある理由は何だろうと思っていました...
乾杯!
編集: param1 は、実際には MethodA の B への参照でした。実際のコードを少しサニタイズしすぎたようです。
Edit2: 2 つの異なるファイルを表示するために、コードを少し再配置しました。このコードがコンパイルされることをテストしました。ごめんなさい!