/* OUTPUT ... Draw ImageView ... View::render ImageView::render ... Draw Sprite ... View::render ImageView::render Sprite::render */ ////////// View /////////////// class View{ public: void Render(){ render(); } protected: virtual void render(){ std::cout << "View::render" << std::endl; }; }; ////////// ImageView /////////////// class ImageView : public View{ public: protected: virtual void render(){ View::render(); std::cout << "ImageView::render" << std::endl; } }; ////////// Sprite /////////////// class Sprite : public ImageView{ public: protected: virtual void render(){ ImageView::render(); std::cout << "Sprite::render" << std::endl; } }; ////////// Utility /////////////// void Draw(View *vw){ vw->Render(); } ////////// main /////////////// int main(){ std::cout << "... Draw ImageView ..." << std::endl; ImageView *imgvw = new ImageView; Draw(imgvw); delete imgvw; std::cout << "... Draw Sprite ..." << std::endl; Sprite *sp = new Sprite; Draw(sp); delete sp; return 0; }