Вызов конструктора предка
От: Аноним  
Дата: 01.12.09 11:19
Оценка:
Здравствуйте
такой вопрос: чем отличаются вызовы

Frame::Frame(const wxString &title):wxFrame(NULL, wxID_ANY, title) {
    wxMessageBox("Hello there!", "Alert", 4|wxCentre, this);
}



Frame::Frame(const wxString &title){
   wxFrame(NULL, wxID_ANY, title) 
   wxMessageBox("Hello there!", "Alert", 4|wxCentre, this);    
}


Первый способ работает, второй — нет (окно wxWidgets не отображается)
Класс Frame — наследник wxFrame
Re: Вызов конструктора предка
От: Тот кто сидит в пруду Россия  
Дата: 01.12.09 11:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте

А>такой вопрос: чем отличаются вызовы

А>
А>Frame::Frame(const wxString &title):wxFrame(NULL, wxID_ANY, title) {
А>    wxMessageBox("Hello there!", "Alert", 4|wxCentre, this);
А>}
А>



А>
А>Frame::Frame(const wxString &title){
А>   wxFrame(NULL, wxID_ANY, title) 
А>   wxMessageBox("Hello there!", "Alert", 4|wxCentre, this);    
А>}
А>


А>Первый способ работает, второй — нет (окно wxWidgets не отображается)

А>Класс Frame — наследник wxFrame

второй — это создание временного объекта типа wxFrame, потом — wxMessageBox, а не вызов конструктора предка
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Вызов конструктора предка
От: Аноним  
Дата: 01.12.09 12:56
Оценка:
Здравствуйте, Тот кто сидит в пруду, Вы писали:

ТКС>второй — это создание временного объекта типа wxFrame, потом — wxMessageBox, а не вызов конструктора предка


Единственный способ вызвать конструктор предка — через двоеточие в заголовке? Просто помнится, был еще какой-то способ из тела конструктора наследника. Или ошибаюсь?
Re[3]: Вызов конструктора предка
От: Тот кто сидит в пруду Россия  
Дата: 01.12.09 13:08
Оценка:
Здравствуйте, Аноним, Вы писали:

ТКС>>второй — это создание временного объекта типа wxFrame, потом — wxMessageBox, а не вызов конструктора предка


А>Единственный способ вызвать конструктор предка — через двоеточие в заголовке? Просто помнится, был еще какой-то способ из тела конструктора наследника. Или ошибаюсь?


Скажем так — единственный нормальный способ вызвать конструктор предка — через список инициализации (двоеточие в заголовке).

PS: А чем так не нравятся списки инициализации?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: Вызов конструктора предка
От: Chorkov Россия  
Дата: 01.12.09 13:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Тот кто сидит в пруду, Вы писали:


ТКС>>второй — это создание временного объекта типа 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, Вы писали:
Спасибо за подробный ответ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.