我正在编写一个涉及多态的C ++程序。我需要重载运算符“ <>”作为朋友功能。
我有基类base和3个派生类:der1,der2,der3和一个指向基类* p的指针。如果我将函数声明为
istream &operator>>(istream &i,der1 &d1) {...}
istream &operator>>(istream &i,der2 &d2) {...}
istream &operator>>(istream &i,der3 &d3) {...}
并称他们为
base *p;
p=new der1;
cin>>p;
该程序无法编译,因为没有带有基本参数的函数。
但是,如果我这样声明,那么实际对象的类型为der1,der2或der3并没有什么区别,尽管我希望它的行为取决于对象的类型。
我所能想到的就是在base中创建一个虚函数并将其继承的类重写。但是因此,我必须将这些函数称为
*p>>cin
看起来不太自然。
我该如何解决这个问题?
最佳答案
您可以为基类创建一个operator>>
:
istream &operator>>(istream &i, base *b) {
b->ReadFromIstream(i);
return i;
}
然后,将
ReadFromIstream
设为虚拟函数,并从派生类中重载它。这样,您具有相同的语法cin >> p
,并且根据p
的类型,它们的行为也有所不同。