{ "metadata": { "name": "", "signature": "sha256:1198072630a182533bf651767f275df9ee5758e0d781322254bb408a8b4cffaa" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "

Chapter 15: Virtual Functions and Polymorphism

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Example 15.1, Page Number: 358

" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\n", "\n", "\n", "class B_class:\n", " def __init__(self):\n", " self.author=None\n", " def put_author(self,s):\n", " self.author=s\n", " def show_author(self):\n", " print self.author\n", " \n", "class D_class(B_class):\n", " def __init__(self):\n", " self.title=None\n", " def put_title(self,num):\n", " self.title=num\n", " def show_title(self):\n", " print \"Title:\",self.title\n", " \n", "#Variable declaration\n", "p=[B_class()] #acts as a pointer to B_class type\n", "B_ob=B_class()\n", "\n", "dp=[D_class()] #acts as a pointer to D_class type\n", "D_ob=D_class()\n", "\n", "p[0]=B_ob #assigning p to object of base\n", "\n", "\n", "#Access B_class via pointer\n", "p[0].put_author(\"Tom Clancy\")\n", "\n", "#Access D_class via base pointer\n", "p[0]=D_ob\n", "p[0].put_author(\"William Shakespeare\")\n", "\n", "#Show that each author went into proper object\n", "B_ob.show_author()\n", "D_ob.show_author()\n", "print \"\\n\"\n", "\n", "#Since put_title() and show_title() are not part of the base class, \n", "#they are not accessible via the base pointer p and must be accessed \n", "#either directly, or, as shown here, through a pointer to the \n", "#derived type\n", "dp[0]=D_ob\n", "dp[0].put_title(\"The Tempest\")\n", "p[0].show_author()\n", "dp[0].show_title()\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Tom Clancy\n", "William Shakespeare\n", "\n", "\n", "William Shakespeare\n", "Title: The Tempest\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Example 15.2, Page Number: 361

" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\n", "\n", "class base:\n", " def who(self): #virtual function\n", " print \"Base\"\n", "\n", "class first_d(base):\n", " def who(self): #redifine who() relative to first_d\n", " print \"First derivation\"\n", " \n", "class second_d(base):\n", " def who(self): #redifine who() relative to second_d\n", " print \"Second derivation\"\n", " \n", " \n", "#Variable declaration\n", "base_obj=base()\n", "p=[base()]\n", "first_obj=first_d()\n", "second_obj=second_d()\n", "\n", "p[0]=base_obj\n", "p[0].who() #access base's who\n", "\n", "p[0]=first_obj\n", "p[0].who() #access first_d's who\n", "\n", "p[0]=second_obj\n", "p[0].who() #access second_d's who\n", "\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Base\n", "First derivation\n", "Second derivation\n" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Example 15.3, Page Number: 363

" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\n", "\n", "class base:\n", " def who(self): #virtual function\n", " print \"Base\"\n", "\n", "class first_d(base):\n", " def who(self): #redifine who() relative to first_d\n", " print \"First derivation\"\n", " \n", "class second_d(base):\n", " #who not defined\n", " pass\n", " \n", " \n", "#Variable declaration\n", "base_obj=base()\n", "p=[base()]\n", "first_obj=first_d()\n", "second_obj=second_d()\n", "\n", "p[0]=base_obj\n", "p[0].who() #access base's who\n", "\n", "p[0]=first_obj\n", "p[0].who() #access first_d's who\n", "\n", "p[0]=second_obj\n", "p[0].who() #access base's who because\n", " #second_d does not redefine it.\n", "\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Base\n", "First derivation\n", "Base\n" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Example 15.4, Page Number: 364

" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\n", "\n", "class base:\n", " def who(self): #virtual function\n", " print \"Base\"\n", "\n", "class first_d(base):\n", " def who(self): #redifine who() relative to first_d\n", " print \"First derivation\"\n", " \n", "#second_d now inherited first_d -- not base\n", "class second_d(first_d):\n", " #who not defined\n", " pass\n", " \n", " \n", "#Variable declaration\n", "base_obj=base()\n", "p=[base()]\n", "first_obj=first_d()\n", "second_obj=second_d()\n", "\n", "p[0]=base_obj\n", "p[0].who() #access base's who\n", "\n", "p[0]=first_obj\n", "p[0].who() #access first_d's who\n", "\n", "p[0]=second_obj\n", "p[0].who() #access first_d's who because\n", " #second_d does not redefine it.\n", "\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Base\n", "First derivation\n", "First derivation\n" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Example 15.5, Page Number: 366

" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\n", "class figure:\n", " def __init__(self):\n", " self._x=None\n", " self._y=None\n", " def set_dim(self,i,j):\n", " self._x=i\n", " self._y=j\n", " def show_area(self):\n", " print \"No area computation defined\",\n", " print \"for this class.\"\n", " \n", "class triangle(figure):\n", " def show_area(self):\n", " print \"Triangle with height\",\n", " print self._x,\"and base\",self._y,\n", " print \"has an area of\",\n", " print self._x*0.5*self._y,\".\"\n", " \n", "class rectangle(figure):\n", " def show_area(self):\n", " print \"Rectangle with dimensions\",\n", " print self._x,\"x\",self._y,\n", " print \"has an area of\",\n", " print self._x*self._y,\".\"\n", " \n", "#Variable declaration\n", "p=[figure()] #pointer to base type\n", "t=triangle() #objects of derived type\n", "r=rectangle()\n", "\n", "p[0]=t\n", "p[0].set_dim(10.0,5.0)\n", "p[0].show_area()\n", "\n", "p[0]=r\n", "p[0].set_dim(10.0,5.0)\n", "p[0].show_area()\n", " " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Triangle with height 10.0 and base 5.0 has an area of 25.0 .\n", "Rectangle with dimensions 10.0 x 5.0 has an area of 50.0 .\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Example 15.6, Page Number: 368

" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\n", "class figure:\n", " def __init__(self):\n", " self._x=None\n", " self._y=None\n", " def set_dim(self,i,j=0):\n", " self._x=i\n", " self._y=j\n", " def show_area(self):\n", " print \"No area computation defined\",\n", " print \"for this class.\"\n", " \n", "class triangle(figure):\n", " def show_area(self):\n", " print \"Triangle with height\",\n", " print self._x,\"and base\",self._y,\n", " print \"has an area of\",\n", " print self._x*0.5*self._y,\".\"\n", " \n", "class rectangle(figure):\n", " def show_area(self):\n", " print \"Rectangle with dimensions\",\n", " print self._x,\"x\",self._y,\n", " print \"has an area of\",\n", " print self._x*self._y,\".\"\n", " \n", "class circle(figure):\n", " def show_area(self):\n", " print \"Circle with radius\",\n", " print self._x,\n", " print \"has an area of\",\n", " print 3.14*self._x*self._x,\".\"\n", " \n", " \n", "#Variable declaration\n", "p=[figure()] #pointer to base type\n", "t=triangle() #objects of derived type\n", "r=rectangle()\n", "c=circle()\n", "\n", "p[0]=t\n", "p[0].set_dim(10.0,5.0)\n", "p[0].show_area()\n", "\n", "p[0]=r\n", "p[0].set_dim(10.0,5.0)\n", "p[0].show_area()\n", "\n", "p[0]=c\n", "p[0].set_dim(9.0)\n", "p[0].show_area()\n", " " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Triangle with height 10.0 and base 5.0 has an area of 25.0 .\n", "Rectangle with dimensions 10.0 x 5.0 has an area of 50.0 .\n", "Circle with radius 9.0 has an area of 254.34 .\n" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }