Вы не хотите делать draw
чистым виртуальным, но вы действительно хотите сделать его (или оставить его) виртуальным.Для этого нужно сделать screens
список из указателей (или, возможно, умных указателей) в GameScreen
с, а не список GameScreen
объектов.
Как и сейчас, когда вы (пытаетесь) вставить свой объект MainMenuScreen
в список, он «нарезается», чтобы фактически стать a GameScreen
объектом - поэтому, когда вы идетеваш список, вы ходите по списку объектов, все действительные типы которых GameScreen
;надеяться получить MainMenuScreen
поведение от любого из них в этот момент бесполезно.
Со списком указателей MainMenuScreen
останется именно таким, поэтому при вызове вашей виртуальной функции вы получитеповедение фактического типа.