|
|
 |
Ответов
|
Nov 18 2007, 13:17
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Я понимаю, что такой стандарт, но все ж таки как-то неудобно. Фактически получается, что любой вызов виртуальной функции в конструкторе приводит в ошибке времени выполнения. Хотя б какой-нибудь ворнинг выдавался... Цитата(dxp @ Nov 18 2007, 15:11)  Где тут лежит объект и что об этом знает компилятор? Когда вы пишите TSlon *p = new TSlon, то вначале вызывается operator new(), затем контсруктор TSlon и только затем инициализируется __vptr. Не до конца понятно, почему нельзя инициализировать __vptr до вызова конструктора - указатель на память, где будет расположен объект, уже есть.
|
|
|
|
|
Nov 18 2007, 14:58
|

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

|
Цитата(Непомнящий Евгений @ Nov 18 2007, 15:17)  ... Когда вы пишите TSlon *p = new TSlon, то вначале вызывается operator new(), затем контсруктор TSlon и только затем инициализируется __vptr. Не до конца понятно, почему нельзя инициализировать __vptr до вызова конструктора - указатель на память, где будет расположен объект, уже есть. Ну и на что должен указывать этот указатель? На обьект, который там скоро появится? Напоминает фразу: "Вы жарьте, а рыба будет".
|
|
|
|
|
Nov 19 2007, 07:01
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(IgorKossak @ Nov 18 2007, 17:58)  Ну и на что должен указывать этот указатель? На обьект, который там скоро появится? Напоминает фразу: "Вы жарьте, а рыба будет". Указатель должен указывать на массив указателей на реализации виртуальных функции. После вызова operator new уже есть указатель на (неиниализированную) память. В этой точке также известна структура создаваемого объекта и его тип - т.е. известно, чему равен __vptr и где он находится. Почему нельзя его записать до вызова пользовательского конструктора, а не после?
|
|
|
|
|
Nov 19 2007, 10:24
|

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

|
Цитата(Непомнящий Евгений @ Nov 19 2007, 13:01)  После вызова operator new уже есть указатель на (неиниализированную) память. В этой точке также известна структура создаваемого объекта и его тип Кому известно? Пральна - конструктору.  Цитата(Непомнящий Евгений @ Nov 19 2007, 13:01)  - т.е. известно, чему равен __vptr и где он находится. Почему нельзя его записать до вызова пользовательского конструктора, а не после? Потому, что по-вашему получается, что надо иметь два конструктора - один предварительный, для создания/инициализации vptr, второй - для всего остального. Какая такая необходимость вызвать виртуальные функции на стадии конструирования объекта?
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Nov 19 2007, 11:52
|

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

|
Цитата(Непомнящий Евгений @ Nov 19 2007, 16:38)  Счас еще раз пересмотрел Страуструпа - не нашел указаний на то, что в конструкторе нельзя дергать виртуальные функции... Наверняка вы у него не найдете и того, что не надо вызывать функцию main из других функций, но это не означает, что такоей вызов надо делать?  Вопрос был о том, зачем вызывать виртуальную функцию из конструируемого объекта, в котором однозначно this содержит адрес текущего (этого конструируемого) объекта и будет вызваться совершенно понятно какая функция - т.е. никакой виртуальности тут нет, один только оверхед. Даже если проинициализировать vptr так, как вы хотите, виртуального по сути вызова тут не получится.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|