c++ - 如何修复称为运行时错误的纯虚函数?

标签 c++ pure-virtual

我明白为什么我会收到我收到的错误(调用纯虚函数)。我正在尝试从如下所示的基类的析构函数中调用纯虚函数。但是,我不知道如何修改我的代码以防止这种情况发生。以下是基类和派生类(无论如何都是相关部分):

基类:

TailFileManager::TailFileManager(const std::string &filename, const int fileOpenPeriod_ms)
: m_Stop(false)
{
    m_WorkerThread.reset(new boost::thread(boost::bind(&TailFileManager::TailFile, this, filename, fileOpenPeriod_ms)));
}

TailFileManager::~TailFileManager()
{
    m_Stop = true;
    m_WorkerThread->join();
}

void TailFileManager::TailFile(const std::string &filename, const int fileOpenPeriod_ms)
{
    std::ifstream ifs(filename.c_str());

    while (! ifs.is_open())
    {
        boost::this_thread::sleep(boost::posix_time::milliseconds(fileOpenPeriod_ms));
    ifs.open(filename.c_str());
    }

    ifs.seekg(0, std::ios::end);

    while (! m_Stop)
    {
        ifs.clear();

        std::string line;

        while (std::getline(ifs, line))
        {
            OnLineAdded(line);
        }

        OnEndOfFile();
    }

    ifs.close();
}

派生类:

ETSLogTailFileManager::ETSLogTailFileManager(const std::string &filename, const int heartbeatPeriod_ms)
: TailFileManager(filename, heartbeatPeriod_ms),
  m_HeartbeatPeriod_ms(heartbeatPeriod_ms),
  m_FoundInboundMessage(false),
  m_TimeOfLastActivity(0)
{
}

ETSLogTailFileManager::~ETSLogTailFileManager()
{
}

void ETSLogTailFileManager::OnLineAdded(const std::string &line)
{
    // do stuff...
}

void ETSLogTailFileManager::OnEndOfFile()
{
    // do stuff...
}

最佳答案

你不应该在构造或销毁期间调用虚函数,因为调用不会按照你的想法去做,如果他们做了,你仍然会不高兴。如果您是正在恢复中的 Java 或 C# 程序员,请密切关注本条款,因为这是这些语言曲折的地方,而 C++ 曲折。

重新设计你的设计,即你可以在对象被销毁之前调用一些清理函数,想法是在 const/dest 期间避免虚函数(如果有的话!),如果你正在使用 C++...

虚拟调用的规则不同。 C++ 2003,第 12.7 节“构造和破坏”,说:

让我们重温一些旧的记忆...

成员函数,包括虚函数 (10.3),可以在构造或销毁过程中调用 (12.6.2)。当从构造函数(包括从数据成员的内存初始化器)或从析构函数中直接或间接调用虚函数时,调用的对象是正在构造或销毁的对象,调用的函数是在构造函数或析构函数自己的类或其基类中定义的一个,但不是在从构造函数或析构函数的类派生的类中覆盖它的函数,或者在最派生对象的其他基类之一中覆盖它的函数(1.8 ).如果虚函数调用使用显式类成员访问(5.2.5)并且对象表达式引用正在构造或销毁的对象但其类型既不是构造函数或析构函数自己的类也不是其基类之一,则结果调用未定义。

由于这种行为差异,建议您永远不要在构造或销毁对象时调用对象的虚函数。

切勿在构建或销毁期间调用虚函数 Effective C++ 摘录,第三版 斯科特迈耶斯 2005 年 6 月 6 日

http://www.artima.com/cppsource/nevercall.html

关于c++ - 如何修复称为运行时错误的纯虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14549489/

相关文章:

c++ - 如何在C system/popen命令中通过另一个C++程序连续输入?

c++ - 为 sql loader 禁用 c++ 输出消息

c++ - 为纯虚析构函数添加定义的目的是什么?

objective-c - 在 Objective-C 中实现纯虚方法

c++ - 共享库中的抽象类

c++ - const 限定符从纯虚函数中消失

c++ - 具有独立主机环境的线程 (c++)

c++ - 为什么这不是一个 constexpr?

c++ - QThreadPool调用父类QRunnable的纯虚函数

C 库的 C++ 包装器