EWERM IAR 4.40A, пишу на плюсах (в настройках стоит Ext. Emb. C++)
создаю класс с чисто виртуальной функцией
Код
virtual BYTE classA::Event(BYTE *) = 0;
наследую и в потомках реализовываю эту функцию
Код
BYTE classB::Event(BYTE *)
{
// some code
return 0;
}
вызов происходит через указатель на базовый класс (хочу полиморфного поведения потомков), при этом для одного из них (из трех) она вызывается, для других двух прога вылетает...
смотрю в map файл линкера и вижу вот такую запись (по этим вызовам происоходит вылет)
-------------------------------------------------------------------------
CODE Segment part 64. NOT NEEDED.
ENTRY ADDRESS REF BY
===== ======= ======
cOPT::Event(unsigned char *)
not allocated function
-------------------------------------------------------------------------
тоже самое для третьего класса (где вызов происходит нормально)
-------------------------------------------------------------------------
CODE
Relative segment, address: 00000444 - 00000D5F (0x91c bytes), align: 2
Segment part 66. Intra module refs: cPCU::__vtbl
ENTRY ADDRESS REF BY
===== ======= ======
cPCU::Event(unsigned char *) 00000445
stack 1 = 00000000 ( 00000028 )
-------------------------------------------------------------------------
Проверял на всех оптимизациях (speed/size)...
Бывали ли такие проблемы? Интерфейс трех классов в одном *.h, Реализация трех классов в одном модуле *.c, хотя врядли это важно...
Догадываюсь что функция которая ни разу не вызывалась может быть заоптимизирована чуть более чем в ноль (вызов только через указатель на базовый класс) но это ведь не камильфо? или я что то не понимаю?
Есть у уважаемого сообщества какие нибудь мысли по этому поводу?
добавлю:
обьекты классов создаются в heap-е, соотв. вызывать чтолибо я могу только через указатели,
просто вызов функции через указатель на потомка, эффекта не дает, вылет происходит точно так же
стека с запасом, хипа тоже
все это вертится в многопоточной scmRTOS, хотя это я полагаю тоже не столь важно для реализации базовых концепций ООП в С++
из дебагеров - консоль printf(); перед вызовом Obj -> Event(*Val); проверяю указатель на обьект - не нулевой, вполне такой валидный, на сколько я могу судить из его 4байтного значения :D