Абстрактный класс и множественное наследование
От: Gregory Россия ICQ 300403361
Дата: 18.01.19 11:02
Оценка:
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. С точки зрения синтаксиса вроде бы тоже все правильно. Что это, глюк компилятора?
Не дай своим глазам увидеть, а ушам услышать то, что ты не сможешь объяснить.
Абрахам ван Хелсинг
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.