在C ++中使用克隆方法实现多态效果

时间:2019-12-02 17:46:27

标签: c++ polymorphism overriding

我在最后一个问题中根本不清楚,这个问题涉及另一个主题(有点像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);时,我将更改将要调用的方法;在列表中,这正是我想要做的

1 个答案:

答案 0 :(得分:0)

我对1201ProgramAlarm表示歉意。

我需要重写write(),但是写入操作不需要返回os,因为os是通过引用传递的,write()实际上应该返回void。同样,也无需再次重写operator<<。我可以重写方法write()。通过覆盖write(),我更改了我在List中调用os << *(new->notification);时要调用的方法,这正是我想要做的。