1.因为输入输出运算符的特殊性,所以基类需声明重载输入输出运算符函数
2.由基类调用派生类的输入输出操作函数来对派生类进行输入输出
3.由于基类无法调用派生类的友元函数,所以派生类应将输入输出操作写在非输入输出运算符函数内
4.由基类的重载输入输出运算符调用派生类的输入输出操作函数,达到输入输出运算符重载的效果
5.派生类需要输入输出重载,则可在自己函数体内声明输入输出重载函数再调用操作函数
#include <iostream>
using namespace std;
class A
{
protected:
int a;
public:
friend ostream& operator<<(ostream &out, A *p)
{
p->Output();
return out;
}
virtual void Output() = 0;
};
class B:public A
{
protected:
int b;
public:
void Output()
{
cout << "B";
}
};
class C:public A
{
protected:
int c;
public:
void Output()
{
cout << "C";
}
};
int main()
{
A *p = new B;
cout << p;
delete p;
p = new C;
cout << p;
return 0;
}