/* OUTPUT Trying to avoid this: http://pastebin.com/08ySYBrT Using this solution: http://stackoverflow.com/a/17218370/286094 ---- Rendering ImageView ---- View::Renderer ImageView::Renderer ---- Rendering Sprite ---- View::Renderer ImageView::Renderer Sprite::Renderer ---- Rendering AwesomeSprite ---- View::Renderer ImageView::Renderer Sprite::Renderer AwesomeSprite::Renderer */ #include #include using namespace std; class View{ public: void Render(){ render(); } protected: class Renderer{ public: Renderer(const View &v){ cout << "View::Renderer" << endl; } }; private: virtual void render() = 0; }; class ImageView : public View{ protected: class Renderer : public View::Renderer{ public: Renderer(const View &v) : View::Renderer(v){ cout << "ImageView::Renderer" << endl; } }; private: virtual void render(){ (Renderer(*this)); } }; class Sprite : public ImageView{ protected: class Renderer : public ImageView::Renderer{ public: Renderer(const View &v) : ImageView::Renderer(v){ cout << "Sprite::Renderer" << endl; } }; private: virtual void render(){ (Renderer(*this)); } }; class AwesomeSprite : public Sprite{ protected: class Renderer : public Sprite::Renderer{ public: Renderer(const View &v) : Sprite::Renderer(v){ cout << "AwesomeSprite::Renderer" << endl; } }; private: virtual void render(){ (Renderer(*this)); } }; void Draw(View *v){ v->Render(); } int main(){ cout << "---- Rendering ImageView ----" << endl; ImageView *img = new ImageView; Draw(img); delete img; cout << endl; cout << "---- Rendering Sprite ----" << endl; Sprite *s = new Sprite; Draw(s); delete s; cout << endl; cout << "---- Rendering AwesomeSprite ----" << endl; AwesomeSprite *as = new AwesomeSprite; Draw(as); delete as; cout << endl; return 0; }