Bonjour, messieurs!
Возникла следующая проблема,заключающаяся в непредсказуемом поведении компилятора VC++.
Есть три класса:
class Father
{
// ....
};
class Mother
{
//......
virtual void foo() = 0;
//......
};
class Daughter : public Father, public Mother
{
//.........
void foo() override;
};
void Daughter::foo()
{
//....
}
При попытке вызвать Daughter::foo все рушится. Как следует из просмотра asm-листинга, в vftable там, где по идее должен был бы находится адрес Daughter::foo, находится непонятно что. Выглядит вызов следующим образом:
mov ecx, dword ptr [this]
add ecx, sizeof(Father)
mov eax, dword ptr [this]
mov edx, dword ptr [eax+sizeof(Father)]
mov eax, dword ptr [edx+offsetof(foo)]
call eax
Выглядит все вроде бы правильно, но при просмотре в дебагере видно, что в eax оказывается вовсе не адрес Daughter::foo. С точки зрения синтаксиса вроде бы тоже все правильно. Что это, глюк компилятора?
Не дай своим глазам увидеть, а ушам услышать то, что ты не сможешь объяснить.
Абрахам ван Хелсинг