А>Первый способ работает, второй — нет (окно wxWidgets не отображается) А>Класс Frame — наследник wxFrame
второй — это создание временного объекта типа wxFrame, потом — wxMessageBox, а не вызов конструктора предка
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Вызов конструктора предка
От:
Аноним
Дата:
01.12.09 12:56
Оценка:
Здравствуйте, Тот кто сидит в пруду, Вы писали:
ТКС>второй — это создание временного объекта типа wxFrame, потом — wxMessageBox, а не вызов конструктора предка
Единственный способ вызвать конструктор предка — через двоеточие в заголовке? Просто помнится, был еще какой-то способ из тела конструктора наследника. Или ошибаюсь?
Здравствуйте, Аноним, Вы писали:
ТКС>>второй — это создание временного объекта типа wxFrame, потом — wxMessageBox, а не вызов конструктора предка
А>Единственный способ вызвать конструктор предка — через двоеточие в заголовке? Просто помнится, был еще какой-то способ из тела конструктора наследника. Или ошибаюсь?
Скажем так — единственный нормальный способ вызвать конструктор предка — через список инициализации (двоеточие в заголовке).
PS: А чем так не нравятся списки инициализации?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Тот кто сидит в пруду, Вы писали:
ТКС>>второй — это создание временного объекта типа wxFrame, потом — wxMessageBox, а не вызов конструктора предка
А>Единственный способ вызвать конструктор предка — через двоеточие в заголовке? Просто помнится, был еще какой-то способ из тела конструктора наследника. Или ошибаюсь?
Двоеточие — единственный способ.
Если в списке инициализации его нет — то будет вывзван конструктор по умолчани.
Так или иначе, при входе в фигурные скобки объект базового класса уже сконструирован.
Если перед инициализацией базового класса нужно произвести какие-то сложные действия, можно использовать отдельную процедуру, результат коотрой будет использоваться при инициализации базового класса или использоввать опретор присвавания для базового класса (если он есть).
class A : B
{
static B init_base(...) { ... }
A(...)
: B( init_base(...) )
{ ... }
}
class A : B
{
A()
// здесь будет вызван конструктор по умолчанию
{
...
*(B*)this = B(....); // здесь будет вызван оператор присваивания для базового класса
...
}
}
Re[4]: Вызов конструктора предка
От:
Аноним
Дата:
01.12.09 15:50
Оценка:
Здравствуйте, Тот кто сидит в пруду, Вы писали:
Спасибо
Здравствуйте, Chorkov, Вы писали:
Спасибо за подробный ответ