加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:53:21 所属栏目:百科 来源:网络整理
导读:我理解为什么我得到了我得到的错误(称为纯虚函数).我试图从我的基类的析构函数中调用纯虚函数,如下所示.但是,我不知道如何重写我的代码以防止这种情况发生.以下是基类和派生类(无论如何相关部分): 基类: TailFileManager::TailFileManager(const std::stri
我理解为什么我得到了我得到的错误(称为纯虚函数).我试图从我的基类的析构函数中调用纯虚函数,如下所示.但是,我不知道如何重写我的代码以防止这种情况发生.以下是基类和派生类(无论如何相关部分):

基类:

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#程序员,请密切关注这个项目,因为这是一个这些语言zig的地方,而C zags.

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

虚拟调用的规则是不同的. C 2003,第12.7节“建筑与销毁”说:

让我们回忆起一些旧的回忆……

成员函数,包括虚函数(10.3),可以在构造或销毁期间调用(12.6.2).当直接或间接地从构造函数(包括来自数据成员的mem-initializer)或析构函数调用虚函数时,调用所适用的对象是正在构造或销毁的对象,调用的函数是一个在构造函数或析构函数自己的类或其基础中定义的,但不是在从构造函数或析构函数类派生的类中重写它的函数,或者在最派生对象的其他一个基类中重写它(1.8) ).如果虚函数调用使用显式类成员访问(5.2.5)并且object-expression引用正在构造或销毁的对象但它的类型既不是构造函数也不是析构函数自己的类或其基础之一,则结果为电话未定义.

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

在施工或销毁期间切勿调用虚拟功能
摘自Effective C,第三版
作者:Scott Meyers
2005年6月6日

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读