У меня возник вопрос о поведении деструктора C++, больше из любопытства, чем что-либо еще. У меня есть следующие классы:Поведение деструктора 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). Я проверил и убедился, что содержащиеся данные верны во время строительства, поэтому мне было интересно, какая причина этого может быть ...
Cheers!
Редактировать: param1 фактически был ссылкой на B в MethodA. Похоже, я слишком сильно дезинфицировал свой настоящий код!
Редактировать 2: немного измените код, чтобы показать два разных файла. Протестировано, что этот код компилируется, колодец. Извини за это!
Ну какой тип вы проходите MethodA? Если вы передаете экземпляр B в MethodA (который передает его в BImp), вы очень непослушны. – Skurmedel
Вы разрезаете (передаете значение B по значению) и используете reinterpret_cast, когда вам этого не нужно. – avakar
Еще одна странность в том, что вы проходите MethodA без указателя, который вы делаете повторно накладываете ... этот код злой! :) – Skurmedel