c++ 如何解决基类数据和派生类数据之间的依赖关系

ohtdti5x  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(87)

我有这样一个类:

class Base
{
public:
Base() { task_ = std::thread(&DexHandlerBase::running_task, this); }
virtual ~Base(){ /*send signal to task_ to stop then */ task_.join();}

protected:
virtual int some_check(int) = 0;

private:
void running_task() { some_check(123); }
std::thread task_;

}

class Derived
{
protected:
int some_check(int) override; //here I use my_data

private:
std::string my_data = "test";
}

程序关闭时有时会产生异常.
我的猜测是derived的默认析构函数被调用,Derived默认析构函数运行,然后my_data被析构。然后基类析构函数被调用,它通知线程它将被析构并等待。但线程正在运行一个调用虚函数的任务,此函数使用不再存在的my_data。
所以从基类到派生类的数据有一个依赖关系。我不想把数据上移,而且函数必须是虚的。我应该重写每个派生类中的析构函数,这样它就关闭了线程,还是有更好的设计?

fhity93d

fhity93d1#

我在基类中运行异步操作时遇到过类似的问题,很可能是在调用Derived的析构函数后,task_试图调用纯虚的virtual int some_check(int) = 0;,所以是非法的,因为Derived已不存在。您应该确保您的Derrived::~Derived()停止了/*send signal to task_ to stop then */的asic操作。实现protectedBase::stopTask()并在Derived DTor中调用它。

相关问题