【问题标题】:C++. Calling a virtual member function in destructor [duplicate]C++。在析构函数中调用虚拟成员函数[重复]
【发布时间】:2015-12-30 21:11:46
【问题描述】:

使用 this 扩展的每个类都在析构函数中调用 abort,调用堆栈告诉我调用 abort 的函数是从头文件中不合理的位置调用的。其他函数被覆盖并且工作正常。

可渲染.h

#pragma once
class Renderable
{
public:
    virtual void update(long delta) = 0;
    virtual void destroy() = 0;
    virtual void render() = 0;
    virtual ~Renderable();
};

可渲染.cpp

#include "Renderable.h"

Renderable::~Renderable()
{
    (this->*(&Renderable::destroy))(); // GLUtils::runOnUIThreadWithContext(this, &Renderable::destroy, true);
} // It says that it gets called from here.

【问题讨论】:

  • 你为什么不press retry to debug the application?你为什么不直接打电话给destroy()
  • whattttt arrreee youuuu doinnnggggggg
  • 你知道(this->*(&Renderable::destroy))(); 只是写destroy(); 的荒谬复杂的方式吧?

标签: c++ member-function-pointers


【解决方案1】:

当实例化一个对象时,基类被初始化,然后子类被初始化。当破坏一个对象时,子类被破坏,然后是基类。子类被销毁后,它的成员和虚方法都不可用——没有destroy()方法被调用。我建议你将destroy()方法中的逻辑移到子类析构函数中。

【讨论】:

    猜你喜欢
    • 2010-10-02
    • 2016-08-14
    • 1970-01-01
    • 2017-08-13
    • 2020-07-06
    • 2017-01-27
    • 2010-09-12
    • 2015-08-05
    • 2011-08-12
    相关资源
    最近更新 更多