Сохранение экземпляра дочернего класса в переменной родительского типа и использование дочерних функций через родительскую переменную?
У меня есть два класса: 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
класс. В этом есть смысл - ведь нельзя относиться ко всем птицам как к орлам.
У вас есть несколько вариантов:
- Не называйте не-
bird
методы - Измените тип
a
кeagle*
- Использовать
dynamic_cast
обойти проблему (не рекомендуется, обычно это признак того, что вы неправильно смоделировали свои данные)
dynamic_cast<eagle*>(a)->attack();
Документация для dynamic_cast
: https://en.cppreference.com/w/cpp/language/dynamic_cast
Вы можете создать атаку виртуальной функции в птице, которая ничего не делает.
Тогда определение атаки в орле переопределит базовое.
virtual void attack() = 0;