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