Страницы

Поиск по вопросам

вторник, 9 октября 2018 г.

Вызов виртуального метода в конструкторе

Помогите разобраться с наследованием и виртуальными функциями. Есть такой класс: .h -
#ifndef CUSTOMSUBWINDOW_H #define CUSTOMSUBWINDOW_H
#include
class CustomSubWindow : public QMdiSubWindow { public: explicit CustomSubWindow(QWidget *parent = 0); virtual void createUI(); };
#endif // CUSTOMSUBWINDOW_H
.cpp -
#include "CustomSubWindow.h"
CustomSubWindow::CustomSubWindow(QWidget *parent) :QMdiSubWindow(parent) { createUI(); } void CustomSubWindow::createUI() { }
Есть класс-наследник: .h -
#ifndef CAT_PRODUCTS_H #define CAT_PRODUCTS_H
#include
class CatProducts : public CustomSubWindow { Q_OBJECT public: explicit CatProducts(QWidget *parent = 0); void createUI(); };
#endif // CAT_PRODUCTS_H
.срр-
#include "CatProducts.h"
CatProducts::CatProducts(QWidget *parent) : CustomSubWindow(parent) { }
void CatProducts::createUI() { setWindowTitle("Справочник товаров!!!"); }
Т.е. в наследнике мы переопределяем метод createUI(), который вызывается в конструкторе базового класса. Как я понимаю, нужно использовать позднее связывание, т.е. объявить метод виртуальным. Но это не работает. В чём я не прав?


Ответ

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

Комментариев нет:

Отправить комментарий