Оператор вывода (<<) для абстрактного класса и производного класса

0

У меня есть 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;

Заранее спасибо.

Теги:
inheritance
operator-overloading
abstract-class

1 ответ

6
Лучший ответ

Перегруженный operator << выбирается во время компиляции на основе статических типов аргументов. Поскольку tt статический тип является team, то operator << который он использовал.

Если вы хотите, чтобы динамический тип объекта определял выход, вам нужно использовать другую технику. Например, вы можете иметь team содержащую функцию виртуальной print, и переопределить ее в BasketTeam. Затем, один operator << возьмите team& t и вызовите t.print() или так. Это вызовет метод print соответствии с динамическим типом t, который вы ищете.

  • 0
    Спасибо, это работает ! Но есть еще одна проблема, вывод должен быть: team_name 0 0 0 0, но по какой-то причине вывод: team_name 00F9AC3E8 0 0 0 любая идея, почему? переменная int и инициализирована: games_played = 0; Но адрес - тот, который выводится.
  • 0
    Заголовок печати: std :: ostream & print_info (std :: ostream & out)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню