Virtual методы override

позволяет правильно использовать перегрузки методов в дочерних классах через указатели

Виртуальный метод — это функция в базовом классе, которую можно переопределить в дочерних классах.

Когда мы вызываем такой метод через указатель/ссылку на базовый класс, то все выполняется корректно, вызывается метод из нужного объекта.

override — это подсказка компилятору: "Я хочу переопределить виртуальный метод". Если метод с таким именем не существует в базовом классе, компилятор выдаст ошибку. override не обязателен, но он не даст вам ошибиться при написании перегрузки виртуального метода.

class weapon // основной класс оружия
{
public:
    virtual void shoot()
    {
        cout << "действие!" << endl;
    }
};

class pistol : public weapon // пистолет
{
public:
    void shoot() override
    {
        cout << "выстрел" << endl;
    }
};

class knife : public weapon // нож
{
public:
    void shoot() override
    {
        cout << "удар ножом" << endl;
    }
};





class Player // КЛАСС ИГРОКА
{
public:
    void shoot(weapon* gun) // передаем ссылку на любой объект вооружения, 
    {                       // вместо бесконечных перегрузок под каждое оружие
        gun->shoot();
    }
};



int main()
{

    knife knife; // объекты
    pistol pistol;
    Player player;


    player.shoot(&pistol); // мы можем передавать объекты унаследованые от weapon

}

От класса weapon наследуются типы вооружения pistol и knife , они имеют разные реализации унаследованного метода shoot() .

В классе игрока player мы хотим передавать указатель на любой объект унаследованный от weapon , что бы передавать любой объект оружия и использовать один и тот же метод выстрела, вместо перегрузки метода под каждое оружие, т.к в игре может быть огромное кол-во вооружения.

Если бы мы не использовали virtual, то при передаче оружия через указатель - метод всегда выводил бы "действие!", т.к он бы не понимал, что нужно использовать перегрузку метода в конкретном объекте.

Передаем объект пистолета по ссылке в класс игрока

Last updated