Я делаю простую программу для воспроизведения определенного боевого вызова в зависимости от выбранного пользователем покемона. У меня есть один основной класс (класс Pokemon) и два класса, которые наследуют виртуальную функцию battleRoar () от основного класса.
Это код
#include <iostream>
using namespace std;
class Pokemon{
public:
virtual void battleCall(){
}
virtual ~Pokemon() {}
};
class Weedle: public Pokemon{
public:
Weedle(){
cout << "Weedle Weedle!" << endl;
}
void battleCall(){
cout << "-v- weedle" << endl;
}
};
class Pikachu: public Pokemon{
public:
Pikachu(){
cout << "Pikaaaachu!" << endl;
}
void battleCall(){
cout << "pikachu!!" << endl;
}
};
int main(){
cout << "Please pick a pokemon." << endl;
cout << "1. Weedle" << endl;
cout << "2. Pikachu" << endl;
int a;
cin >> a;
if (a == 1){
cout << "You picked a weedle!" << endl;
Weedle chosenPoke;
Pokemon *p1 = &chosenPoke;
}
else if (a == 2){
cout << "You picked a pikachu!" << endl;
Pikachu chosenPoke;
Pokemon *p1 = &chosenPoke;
} else { cout << "Invalid choice" << endl;}
cout << "Would you like to hear your pokemon's battle call?" << endl;
cout << "Yes or No" << endl;
string choose;
cin >> choose;
p1->battleCall(); //produces error: use of undeclared identifier 'p1
return 0;
}
Проблема, с которой я столкнулся, заключается в том, что указатели основного класса, указывающие на подкласс, больше не доступны за пределами условного выражения. В этом случае я знаю, что было бы просто вызвать рев в каждой условной ветви. Однако я хотел бы иметь возможность вызывать любой подкласс, созданный с помощью указателя, вместо создания вызова функции для каждого варианта условного выражения.