求教关于友元函数的有关问题

求教关于友元函数的问题!
我按谭浩强的c++第二版教材407页写了如下代码,发现按书上所说设定基类。到派生类之后,派生类的友元函数无法调用派生类的保护成员。本代码倒数第三行换为output<<"["<<p.getX()<<","<<p.getY()<<"]";才能编译成功,我用的vc6.0。能有人指教下么?
#include<iostream>
using namespace std;
class Shape
{
public:
virtual float area()const{return 0.0;}
virtual float volume()const{return 0.0;}
virtual void shapeName()const =0;
};
class Point:public Shape
{
public:
Point(float=0,float=0);
void setPoint(float,float);
float getX()const{return x;}
float getY()const{return y;}
virtual void shapeName() const{cout<<"Point:";}
friend ostream &operator<<(ostream &,const Point &);
protected:
float x,y;
};
Point::Point(float a,float b)
{
x=a;
y=b;
}
void Point::setPoint(float a,float b)
{
x=a;
y=b;
}
 ostream &operator<<(ostream &output,const Point &p)
{
output<<"["<<p.x<<","<<p.y<<"]";
return output;
}
 


------解决方案--------------------
vc6.0对友元的支持有问题。所以用其他编译器吧
------解决方案--------------------
VS05以上的都不错
或者用GCC吧