我有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;
提前致谢。
答案 0 :(得分:6)
在编译时根据参数的静态类型选择重载的operator <<
。由于tt
的静态类型为team
,因此它使用的是operator <<
。
如果希望对象的动态类型确定输出,则必须使用其他一些技术。例如,您可以让team
包含虚拟print
函数,并在BasketTeam
中覆盖它。然后,让operator <<
一个人team& t
,然后拨打t.print()
左右。这将根据您正在寻找的print
的动态类型调用t
方法。