C++ переопределение виртуальной функции

Рейтинг: 1Ответов: 1Опубликовано: 08.01.2023

Прочёл что при создании virtual void foo(){}; даст возможность переопределять функции в дочерних классах, но этого не случается

GameObject.hpp

#pragma once

#include "SFML/Graphics.hpp"

namespace snake{
    class GameObject : public sf::RectangleShape{
    public:
        GameObject();

        std::string name;

        virtual void logic();
        void setObjectTexture(std::string texturePath);

    private:
        sf::Texture *textureObject;
        void setup();
    };
}

Его логика

void GameObject::logic(){
    std::cout << "old logic" << std::endl;
}

Button.hpp

#pragma once

#include "Snake/GameObject.hpp"
#include "iostream"

namespace Ui{
    class Button : public virtual snake::GameObject{
    public:
        void logic();

    private:
        void setup();
    };
}

Его логика

void Button::logic() {
    std::cout << "new logic" << std::endl;
}

Однако при вызове функции из другого класса(Объект класса Button уже лежит в векторе gameObjects)

void Scene::logicObjects(){
    for (int i = 0; i != gameObjects.size(); i++)
        gameObjects[i].logic();
}

Я вижу вывод в консоль old logic, хотя казалось бы, переопределил функцию. Что пошло не так и почему не срабатывает переопределение функции?

Ответы

▲ 2Принят

Как я понимаю, у вас вектор такой?

vector<snake::GameObject> gameObjects;

Тогда при внесении в него объектов, производных от snake::GameObject, происходит их срезка до snake::GameObject, и, соответственно, вызывается logic() для этого типа.

Вот если бы вы работали с vector<snake::GameObject*>...