C++ 析构函数行为

标签 c++ inheritance virtual-destructor

我有一个关于 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/

相关文章:

c++ - 应该在哪里声明纯虚析构函数?

c++ - 将 std::string 传递给 C 风格的 API 是否安全?

c++ - Cygwin + windows 10 错误 "sigfillset was not declared in the scope"

c++ - 当一个类继承自一个在 C++ 中所有成员都是私有(private)的类时,该类的大小是多少?

c++ - 访问基类的公共(public)成员失败

c++ - 如果未使用 shared_ptr 定义虚拟析构函数,是否有任何优势

c++ - 什么时候以及为什么不应该将基类中的析构函数定义为虚拟的?

c++ - 在(c++) cocos2dx中将 map 对象添加到Vector

C++ unordered_map 在运行时指定类型

java - 接口(interface)和具体类中的类型参数泛型