我有一个关于 C++ 析构函数行为的问题,更多的是出于好奇而不是其他任何原因。我有以下类(class):
基础.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 实际上是对 MethodA 中 B 的引用。看起来我对我的真实代码过度清理了一点!
Edit2:稍微重新安排了代码以显示两个不同的文件。测试了这段代码编译,很好。对此感到抱歉!
最佳答案
如果像本例中那样在相关类型之间进行转换,you should use static_cast
or dynamic_cast
,而不是 reinterpret_cast
,因为编译器可能在将对象指针值转换为派生程度更高的类型时调整对象指针值。 reinterpret_cast
的结果在这种情况下是未定义的,因为它只是采用指针值并假装它是另一个对象,而不考虑对象布局。
关于C++ 析构函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1937392/