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如何指向不同的对象?如何在虚拟呼叫中崩溃并成功执行非虚拟呼叫?