Сохранение экземпляра дочернего класса в переменной родительского типа и использование дочерних функций через родительскую переменную?

У меня есть два класса: Bird и Eagle. Орел унаследован от птицы. Теперь я могу использовать класс Bird для хранения экземпляра типа орла. Однако, когда я пытаюсь вызвать функцию орла, используя переменнуюa Я получаю сообщение об ошибке

ошибка: "класс птица" не имеет участника с именем "атака"

Как использовать функцию атаки? Кроме того, будет ли это похоже на машинописный текст?

#include <stdio.h>

class bird{
    public:
    void fly(){
        printf("fly");
    }
};

class eagle: public bird{
    public:
    void attack(){
        printf("attack");
    }
};

int main()
{
    bird *a = new eagle();
    a->attack();



    return 0;
}

2 ответа

Переменная a указатель на объект типа bird, поэтому вам разрешено вызывать только те методы, которые определены в birdкласс. В этом есть смысл - ведь нельзя относиться ко всем птицам как к орлам.

У вас есть несколько вариантов:

  1. Не называйте не-bird методы
  2. Измените тип a к eagle*
  3. Использовать dynamic_cast обойти проблему (не рекомендуется, обычно это признак того, что вы неправильно смоделировали свои данные)
dynamic_cast<eagle*>(a)->attack();

Документация для dynamic_cast: https://en.cppreference.com/w/cpp/language/dynamic_cast

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

Тогда определение атаки в орле переопределит базовое.

      virtual void attack() = 0;
Другие вопросы по тегам