我在最后一个问题中根本不清楚,这个问题涉及另一个主题(有点像XY问题),因此我将从基础知识入手。 我在班级有一个清单,叫做清单
class List {
private:
struct Elem {
Notification* notif;
Elem* next;
Elem(const Notification& OB) : notif(OB.clone()), next(nullptr) {}
};
Elem* first; };
我有一个通知类
class Notification {
public:
virtual Notification* clone() const { return new Notification(*this); }
virtual write(ostream& os)const { return os << "Some text from class Notif";}
friend ostream& operator<<(ostream& os, const Notification& OB) {
OB.write(os); return os; } };
我还有一个Error类,它是从通知派生的,应该具有不同定义的运算符<<< / p>
class Error: public Notification {
private:
string error_text;
public:
Error* clone() const { return new Error(*this); }
friend ostream& operator<<(ostream& os, Error& OBJ) {
OBJ.Notification::write(os); os << OBJ.error_text << endl;
return os;
}
};
现在我想通过重写运算符<<< / p>将列表打印到输出中
ostream& operator<<(ostream& os, const List& list) {
List::Elem* new = list.first;
while (new) {
os << *(new->notification);
new = new->next;
}
return os;
}
但是当我主要执行cout << list
时,我只会收到通知消息。有什么方法可以解决运算符<<是全局朋友功能吗?由于多态性是全局函数,或者因为我在打印时取消引用指针,所以多态性不起作用吗?我已经有点迷路了。
编辑-已解决
我对1201ProgramAlarm表示歉意。
我需要重写write(),但事实是write不需要返回os,因为os是通过引用传递的,所以write()实际上应该返回void。同样,也无需再次重写operator <<。我可以重写方法write()。通过重写write(),当我调用os << *(new-> notification);时,我将更改将要调用的方法;在列表中,这正是我想要做的
答案 0 :(得分:0)
我对1201ProgramAlarm表示歉意。
我需要重写write()
,但是写入操作不需要返回os
,因为os
是通过引用传递的,write()
实际上应该返回void。同样,也无需再次重写operator<<
。我可以重写方法write()
。通过覆盖write()
,我更改了我在List中调用os << *(new->notification);
时要调用的方法,这正是我想要做的。