输出运算符(<<&lt ;;)用于抽象类和派生类

时间:2013-12-21 16:05:54

标签: c++ inheritance operator-overloading abstract-class

我有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;

提前致谢。

1 个答案:

答案 0 :(得分:6)

在编译时根据参数的静态类型选择重载的operator <<。由于tt的静态类型为team,因此它使用的是operator <<

如果希望对象的动态类型确定输出,则必须使用其他一些技术。例如,您可以让team包含虚拟print函数,并在BasketTeam中覆盖它。然后,让operator <<一个人team& t,然后拨打t.print()左右。这将根据您正在寻找的print的动态类型调用t方法。