C ++。在析构函数中调用虚拟成员函数

时间:2015-10-02 15:41:00

标签: c++ member-function-pointers

每个使用此调用进行扩展的类都会在析构函数中中止,并且调用堆栈告诉我调用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.

Calls abort. enter image description here

1 个答案:

答案 0 :(得分:7)

实例化对象时,基类会被初始化,然后子类被初始化。在破坏对象时,子类会被破坏,然后是基类。子类被破坏后,其成员和虚方法不可用 - 没有destroy()方法被调用。我建议你将destroy()方法中的逻辑移动到子类析构函数。