我们总是声明一个纯虚函数:
virtual void fun () = 0 ;
Run Code Online (Sandbox Code Playgroud)
即,它总是被赋值为0.
我的理解是,这是将此函数的vtable条目初始化为NULL,此处的任何其他值都会导致编译时错误.这种理解是否正确?
我明白为什么会发生这种情况,但我一直试图解决它...这是我的代码在我的程序退出时生成错误(因此导致崩溃)时所做的事情...
pure virtual method called
SomeClass::~SomeClass()
{
BaseClassObject->SomePureVirtualMethod(this);
}
Run Code Online (Sandbox Code Playgroud)
void DerivedClass::SomePureVirtualMethod(SomeClass* obj)
{
//Do stuff to remove obj from a collection
}
Run Code Online (Sandbox Code Playgroud)
我从来没有打过电话,new SomeClass但我有一个QList<SomeClass*>我追加SomeClass*对象的东西.这个析构函数的目的SomeClass是告诉从它的集合中DerivedClass删除一个特定的实例.SomeClassQList<SomeClass*>
所以,在一个具体的例子......
BaseClass = Shape
DerivedClass = Triangle
SomeClass= ShapeProperties拥有对的引用Shape
所以,我从来没有打过电话,new ShapeProperties但我有一个QList<ShapeProperties*>内心Triangle.析构函数ShapeProperties是告诉从它的集合中Triangle删除特定属性.ShapePropertiesQList<ShapeProperties*>
我理解为什么我得到了我得到的错误(称为纯虚函数).我试图从我的基类的析构函数中调用纯虚函数,如下所示.但是,我不知道如何重写我的代码以防止这种情况发生.以下是基类和派生类(无论如何相关部分):
基类:
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();
}
Run Code Online (Sandbox Code Playgroud)
派生类:
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 …Run Code Online (Sandbox Code Playgroud)