###Inheritance is by default `private` class concreteObserver : ObserverInterface ^^^^ Need public: here ### Mark overriden methods: void update(std::string message) // override ??? ### endl vs '\n' Don't use `endl` unless you absolutely want to flush the buffer. Probably OK here. Just wanted to note it. ###Don't pass pointers: void subscribe(concreteObserver *subscriber) Is subscriber every going to be NULL? Do you need to check if subscriber has been destroyed? Personally. I would pass by reference and document that a subject must live longer than the observers. Not that just because you pass by reference does not mean you can hold a pointer. void subscribe(concreteObserver& subscriber) // pass by reference { subscribers.push_back(&subscriber); // but save pointer. } But if you have a lot of dynamically allocated stuff this may not be suffecient. You could pass a `std::weak_ptr` then check of the subscriber is still available before sending the message. ###Use the new foreach loop std::vector<concreteObserver*>::const_iterator itr = subscribers.begin(); while (itr != subscribers.end()) { (*itr)->update(message); ++itr; } Easier to write as: for(auto& sub: subscribers) { sub->update(message); }