У меня есть 2 класса, абстрактный базовый класс и производный класс. Но по какой-то причине я не могу правильно перегрузить операторы вывода для обоих.
Вот базовый класс:
class team
{
char* team_name;
int games_played;
public:
team(const char* tname);
virtual ~team();
virtual void update_lpoints(const int win_loss)=0;
friend std:: ostream& operator<< (std :: ostream& out, team& T);
};
std:: ostream& operator<< (std :: ostream& out, team& T);
И вот оператор вывода:
std:: ostream& operator<< (std :: ostream& out, team& T)
{
return (out<<T.team_name<<" "<<T.games_played);
}
Производный класс:
class BasketTeam : public team
{
int league_points;
int points_for;
int points_against;
public:
BasketTeam(const char* tname);
~BasketTeam();
friend std:: ostream& operator<< (std :: ostream& out, BasketTeam& T);
};
std:: ostream& operator<< (std :: ostream& out, BasketTeam& T);
Вот оператор вывода для производного класса:
std:: ostream& operator<< (std :: ostream& out, BasketTeam& T)
{
out<<T.get_name()<<" "<<T.get_played_games()<<" "<<T.league_points<<" "<<T.points_for<<" "<<T.points_against<<endl;
return out;
}
Когда я создаю объект и пытаюсь его распечатать, я могу получить базовый класс, а не производный класс.
team* tt = new BasketTeam ("ran");
cout<<*tt;
Заранее спасибо.
Перегруженный operator <<
выбирается во время компиляции на основе статических типов аргументов. Поскольку tt
статический тип является team
, то operator <<
который он использовал.
Если вы хотите, чтобы динамический тип объекта определял выход, вам нужно использовать другую технику. Например, вы можете иметь team
содержащую функцию виртуальной print
, и переопределить ее в BasketTeam
. Затем, один operator <<
возьмите team& t
и вызовите t.print()
или так. Это вызовет метод print
соответствии с динамическим типом t
, который вы ищете.