Я собираюсь сделать вывод, что ты из Objective-C?;)
Я думаю, что все ваши проблемы связаны с непониманием того, как создаются объекты C ++.
Прежде всего: window = &BasicWindow();
- это не то, как вы должны создавать новый объект.Вам нужно использовать window = new BasicWindow;
Это приводит к тому, что для BasicWindow выделяется место в памяти, и вызывается конструктор по умолчанию для BasicWindow.
В вашем методе main () есть похожая ошибка, однако в этомЕсли вам не нужно использовать new для его выделения, вы можете просто объявить экземпляр, и он будет создан в стеке.
Ваш основной метод будет выглядеть следующим образом:
int main ()
{
Game game;
game.createWindow();
return 0;
}
Оставшаяся проблема в том, что ваши методы init не вызываются.В C ++ конструкторы вызываются автоматически и имеют то же имя, что и класс.Пример конструктора по умолчанию для игрового класса:
Game() { window = new OpenGLWindow(); }
Еще одна вещь, которую вам нужно знать, это то, что, в отличие от цели C, вся иерархия конструкторов вызывается автоматически при создании объекта.То есть, когда вы создаете экземпляр Game, вызывается его конструктор, а также конструктор каждого базового класса.Фактически, конструктор базового класса называется FIRST.Так что в вашем случае, если вы просто измените методы init на конструкторы, вы выделите два окна (по одному для каждого типа) и пропустите BasicWindow.Что не круто.
Возможно, вам следует просто оставить их с именем init и просто убедиться, что вы вызываете их сразу после создания.
В общем, попробуйте это:
class App
{
public:
virtual void init(void) { window = new BasicWindow; }
virtual void createWindow(void) { window->create(); }
protected:
Window *window;
};
class Game : public App
{
public:
virtual void init(void) { window = new OpenGLWindow; }
};
int main ()
{
Game game;
game.init();
game.createWindow();
return 0;
}
(и не забудьте очистить новые объекты!)
РЕДАКТИРОВАТЬ (добавлен пример с очисткой):
class App
{
public:
App() : window( NULL ) {}
virtual ~App() { delete window; }
virtual void init() { window = new BasicWindow; }
virtual void createWindow() { window->create(); }
protected:
Window *window;
};
class Game : public App
{
public:
virtual void init() { window = new OpenGLWindow; }
};
int main ()
{
Game game;
game.init();
game.createWindow();
return 0;
}