#include <vector>
#include <iostream>

using namespace std;

class Observer {
public:
    virtual ~Observer() {}
    virtual void update() = 0;
};

class MainView {
public:
    void close() {
		for(Observer* o : observers_ ) {
			o->update();
		}
    }
    void reg(Observer* obs) { observers_.push_back(obs); }
private:
    std::vector<Observer*> observers_;
};


class ChildViewA : public Observer {
public:
    ChildViewA(MainView* m) : m_(m) {}
    void open() {
        m_->reg(this);
    }
    virtual void update() {
        close();
    }
    void close() {
        cout << "close child" << endl;
    }
private:
    MainView* m_;
};

class ChildViewB : public Observer {
public:
    ChildViewB(MainView* m) : m_(m) {}

    void open() {
        m_->reg(this);
    }
    virtual void update() {
        close();
    }
    void close() {
        cout << "close child" << endl;
    }

private:
    MainView* m_;
};

int main() {
    MainView m;
    ChildViewA ch1(&m);
    ch1.open();
    ChildViewB ch2(&m);
    ch2.open();
    ChildViewA ch3(&m);
    m.close();
}
