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

 
 
> IAR EWAVR и виртуальные функции
AlexG_changed
сообщение Nov 12 2007, 12:41
Сообщение #1


Участник
*

Группа: Validating
Сообщений: 64
Регистрация: 16-06-05
Пользователь №: 6 073



Компилятор IAR EWAVR 4.20A
Микроконтроллер ATmega128

В программе есть родительский класс и два наследованных от него класса, отличающихся парой функций.
При объявлении соответствующих функций родительского класса виртуальными программа виснет где-то между __low_level_init() и main(). Если сделать функции не виртуальными, то программа работает, но вызываются функции родительского класса, а не наследованных, что делает использование наследования в данном случае бессмысленным.

В чем может быть причина полной неработоспособности программы с виртуальными функциями?

После очередной перекомпиляции еще интереснее:
The application aborted
Program exit reached

(отлаживаю под JTAG ICE)

Сообщение отредактировал AlexG - Nov 12 2007, 12:47
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Непомнящий Евген...
сообщение Nov 18 2007, 13:17
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Я понимаю, что такой стандарт, но все ж таки как-то неудобно. Фактически получается, что любой вызов виртуальной функции в конструкторе приводит в ошибке времени выполнения. Хотя б какой-нибудь ворнинг выдавался...

Цитата(dxp @ Nov 18 2007, 15:11) *
Где тут лежит объект и что об этом знает компилятор?


Когда вы пишите TSlon *p = new TSlon, то вначале вызывается operator new(), затем контсруктор TSlon и только затем инициализируется __vptr. Не до конца понятно, почему нельзя инициализировать __vptr до вызова конструктора - указатель на память, где будет расположен объект, уже есть.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 18 2007, 14:58
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Непомнящий Евгений @ Nov 18 2007, 15:17) *
...
Когда вы пишите TSlon *p = new TSlon, то вначале вызывается operator new(), затем контсруктор TSlon и только затем инициализируется __vptr. Не до конца понятно, почему нельзя инициализировать __vptr до вызова конструктора - указатель на память, где будет расположен объект, уже есть.

Ну и на что должен указывать этот указатель? На обьект, который там скоро появится?
Напоминает фразу: "Вы жарьте, а рыба будет".
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Nov 19 2007, 07:01
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(IgorKossak @ Nov 18 2007, 17:58) *
Ну и на что должен указывать этот указатель? На обьект, который там скоро появится?
Напоминает фразу: "Вы жарьте, а рыба будет".

Указатель должен указывать на массив указателей на реализации виртуальных функции.

После вызова operator new уже есть указатель на (неиниализированную) память. В этой точке также известна структура создаваемого объекта и его тип - т.е. известно, чему равен __vptr и где он находится. Почему нельзя его записать до вызова пользовательского конструктора, а не после?
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 19 2007, 10:24
Сообщение #5


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Непомнящий Евгений @ Nov 19 2007, 13:01) *
После вызова operator new уже есть указатель на (неиниализированную) память. В этой точке также известна структура создаваемого объекта и его тип

Кому известно? Пральна - конструктору. smile.gif

Цитата(Непомнящий Евгений @ Nov 19 2007, 13:01) *
- т.е. известно, чему равен __vptr и где он находится. Почему нельзя его записать до вызова пользовательского конструктора, а не после?

Потому, что по-вашему получается, что надо иметь два конструктора - один предварительный, для создания/инициализации vptr, второй - для всего остального.

Какая такая необходимость вызвать виртуальные функции на стадии конструирования объекта?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Nov 19 2007, 10:38
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(dxp @ Nov 19 2007, 13:24) *
Какая такая необходимость вызвать виртуальные функции на стадии конструирования объекта?


Ну напоролся же один раз - значит была необходимость. Когда понял в чем дело - обошелся smile.gif
Счас еще раз пересмотрел Страуструпа - не нашел указаний на то, что в конструкторе нельзя дергать виртуальные функции...
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 19 2007, 11:52
Сообщение #7


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Непомнящий Евгений @ Nov 19 2007, 16:38) *
Счас еще раз пересмотрел Страуструпа - не нашел указаний на то, что в конструкторе нельзя дергать виртуальные функции...

Наверняка вы у него не найдете и того, что не надо вызывать функцию main из других функций, но это не означает, что такоей вызов надо делать? smile.gif

Вопрос был о том, зачем вызывать виртуальную функцию из конструируемого объекта, в котором однозначно this содержит адрес текущего (этого конструируемого) объекта и будет вызваться совершенно понятно какая функция - т.е. никакой виртуальности тут нет, один только оверхед. Даже если проинициализировать vptr так, как вы хотите, виртуального по сути вызова тут не получится.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AlexG   IAR EWAVR и виртуальные функции   Nov 12 2007, 12:41
- - alexander55   Цитата(AlexG @ Nov 12 2007, 15:41) Приве...   Nov 12 2007, 13:00
- - AlexG   Разобрался. Вызывать виртуальную функцию прямо в к...   Nov 13 2007, 04:10
|- - Непомнящий Евгений   Цитата(AlexG @ Nov 13 2007, 07:10) Разобр...   Nov 15 2007, 06:38
|- - dxp   Цитата(Непомнящий Евгений @ Nov 15 2007, 12...   Nov 15 2007, 07:06
- - Непомнящий Евгений   А почему нельзя инициализировать его до выполнения...   Nov 18 2007, 08:54
|- - dxp   Цитата(Непомнящий Евгений @ Nov 18 2007, 14...   Nov 18 2007, 12:11
|- - Николай Z   Цитата(Непомнящий Евгений @ Nov 18 2007, 11...   Nov 18 2007, 12:46
- - alexander55   Цитата(Непомнящий Евгений @ Nov 19 2007, 10...   Nov 19 2007, 07:23


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:07
Рейтинг@Mail.ru


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