虚拟呼叫崩溃

时间:2013-12-22 19:21:54

标签: c++ function pointers crash

class AbstractEffect{
public:
   AbstractEffect() : _id(AbstractEffect::generateID()){}

   virtual void update() const{
       LOG("Base class Update");
   }

   void nonVirtualCall() const{
       LOG("Test call");
   }


   private:
   const int _id;

   static int generateID(){ static int id= 0; return id++; }
}

class EffectImpl : public AbstractEffect{
public:
    EffectImpl(){}

    virtual void update() const{
         LOG("Impl update");
    } 
}

class Adapter{
public:
      Adapter(const AbstractEffect* effect) : _effect(effect) { }

void update(){
     LOG("This " << this);
     LOG("Effect address " << _effect);
     _effect->nonVirtualCall(); // dummy call I made to see what happens
     _effect->update(); // virtual function call
}

private:
    const AbstractEffect* const _effect; 
}

适配器类。调用Update()。输出:

This 04155D90
Effect address 006F4A58
Test Call
Impl update

下一次迭代(下一次游戏循环更新),调用相同的Adapter,Update()。输出:

This 04155D90
Effect address 0020F65C
Test Call

...在更新虚拟呼叫中崩溃(访问冲突)。正如您所看到的那样,它是相同的适配器类,但效果不同,即使我已将其定义为const *。我已经检查了两个调用中对象的属性值。在第一个_id是0(应该是),在第二个它是一个八位数字(例如68509216)。我在效果的析构函数上放了一个断点,以确保对象不会被破坏。

const AbstractEffect * const如何指向不同的对象?如何在虚拟呼叫中崩溃并成功执行非虚拟呼叫?

0 个答案:

没有答案