реклама на сайте
подробности

 
 
> полиморфизм в IAR или куда деваются функции, проблема с перегрузкой виртуальной функции
helius
сообщение Mar 30 2009, 11:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 25-01-06
Пользователь №: 13 580



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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
helius
сообщение Mar 30 2009, 12:06
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 25-01-06
Пользователь №: 13 580



вызов виртуальной функции через базовый класс подразумевает табличку функций для всех потомков, некая virtual table, а так же есть процесс позднего связывания (через эту табличку)... как это реализовано в IAR я, увы, слабо представляю... но полагаю что решение где то здесь

Цитата
Что перед вызовом читается из vtbl для правильных и неправильных объектов?


гм, проверю...

что то при вызове метода обращения к таблице я невижу, зато на предпоследней инструкции прыжок происходит очень далеко в сплошные нули

pPPD[temp] -> Event((BYTE *)temp);

0000AAE4 6822 LDR R2, [R4, #0]
0000AAE6 2100 MOV R1, #0
0000AAE8 6810 LDR R0, [R2, #0]
0000AAEA 6882 LDR R2, [R0, #8]
0000AAEC 6812 LDR R2, [R2, #0]
0000AAEE F003 ; pre BL/BLX
0000AAF0 FA43 BL ??rT_BX_R2 ; 0xDF78

Сообщение отредактировал helius - Mar 30 2009, 12:07
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 17:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016