C++。在析构函数中调用虚成员函数
C++. Calling a virtual member function in destructor
每个使用此扩展的 class 在析构函数中调用 abort 并且调用堆栈告诉我调用 abort 的函数是从头文件中的不合理位置调用的。其他功能被覆盖并且工作正常。
Renderable.h
#pragma once
class Renderable
{
public:
virtual void update(long delta) = 0;
virtual void destroy() = 0;
virtual void render() = 0;
virtual ~Renderable();
};
Renderable.cpp
#include "Renderable.h"
Renderable::~Renderable()
{
(this->*(&Renderable::destroy))(); // GLUtils::runOnUIThreadWithContext(this, &Renderable::destroy, true);
} // It says that it gets called from here.
当实例化一个对象时,base class 被初始化,然后 subclass 被初始化。当销毁一个对象时,subclass 被销毁,然后是 base class。 subclass被析构后,其成员和虚方法都不可用——没有destroy()
方法可以调用。我建议你将 destroy()
方法中的逻辑移动到 subclass 析构函数中。
每个使用此扩展的 class 在析构函数中调用 abort 并且调用堆栈告诉我调用 abort 的函数是从头文件中的不合理位置调用的。其他功能被覆盖并且工作正常。
Renderable.h
#pragma once
class Renderable
{
public:
virtual void update(long delta) = 0;
virtual void destroy() = 0;
virtual void render() = 0;
virtual ~Renderable();
};
Renderable.cpp
#include "Renderable.h"
Renderable::~Renderable()
{
(this->*(&Renderable::destroy))(); // GLUtils::runOnUIThreadWithContext(this, &Renderable::destroy, true);
} // It says that it gets called from here.
当实例化一个对象时,base class 被初始化,然后 subclass 被初始化。当销毁一个对象时,subclass 被销毁,然后是 base class。 subclass被析构后,其成员和虚方法都不可用——没有destroy()
方法可以调用。我建议你将 destroy()
方法中的逻辑移动到 subclass 析构函数中。