У меня был вопрос о поведении деструктора 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&);
};
Теперь проблема в том, что с этим кодом все работает безупречно. Однако, когда я делаю деструктор для BImp виртуальным, при вызове AImp :: MethodA класс BImp, кажется, неинициализирует свои данные (m_data1 и m_data2). Я проверил и удостоверился, что содержащиеся в нем данные верны во время строительства, поэтому мне было интересно, что может быть причиной этого ...
Ура!
Редактировать: param1 был фактически ссылкой на B в MethodA. Похоже, я слишком много продезинфицировал свой реальный код!
Edit2: немного переставил код, чтобы показать два разных файла. Проверено, что этот код компилируется, хорошо. Извините за это!