<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://assela.pathirana.net/index.php?action=history&amp;feed=atom&amp;title=Template%3ACpptutorial_Polymorphism</id>
	<title>Template:Cpptutorial Polymorphism - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://assela.pathirana.net/index.php?action=history&amp;feed=atom&amp;title=Template%3ACpptutorial_Polymorphism"/>
	<link rel="alternate" type="text/html" href="https://assela.pathirana.net/index.php?title=Template:Cpptutorial_Polymorphism&amp;action=history"/>
	<updated>2026-05-15T08:48:03Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.0</generator>
	<entry>
		<id>https://assela.pathirana.net/index.php?title=Template:Cpptutorial_Polymorphism&amp;diff=3594&amp;oldid=prev</id>
		<title>Root: 1 revision(s)</title>
		<link rel="alternate" type="text/html" href="https://assela.pathirana.net/index.php?title=Template:Cpptutorial_Polymorphism&amp;diff=3594&amp;oldid=prev"/>
		<updated>2007-06-08T15:04:45Z</updated>

		<summary type="html">&lt;p&gt;1 revision(s)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 15:04, 8 June 2007&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://assela.pathirana.net/index.php?title=Template:Cpptutorial_Polymorphism&amp;diff=3593&amp;oldid=prev</id>
		<title>Root at 09:48, 3 April 2007</title>
		<link rel="alternate" type="text/html" href="https://assela.pathirana.net/index.php?title=Template:Cpptutorial_Polymorphism&amp;diff=3593&amp;oldid=prev"/>
		<updated>2007-04-03T09:48:37Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Polymorphism=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Before getting into this section, it is recommended that you have a proper understanding of pointers and class inheritance. If any of the following statements seem strange to you, you should review the indicated sections:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;boxed&amp;quot;&lt;br /&gt;
! Statement:&lt;br /&gt;
! Explained in:&lt;br /&gt;
|-&lt;br /&gt;
| int a::b(c) {};&lt;br /&gt;
| Classes&lt;br /&gt;
|-&lt;br /&gt;
| a-&amp;gt;b&lt;br /&gt;
| Pointers&lt;br /&gt;
|-&lt;br /&gt;
| class a: public b;&lt;br /&gt;
| Friendship and inheritance&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Pointers to base class===&lt;br /&gt;
&lt;br /&gt;
One of the key features of derived classes is that a pointer to a derived class is type-compatible with a pointer to its base class. Polymorphism is the art of taking advantage of this simple but powerful and versatile feature, that brings Object Oriented Methodologies to its full potential.&lt;br /&gt;
&lt;br /&gt;
We are going to start by rewriting our program about the rectangle and the triangle of the previous section taking into consideration this pointer compatibility property:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;codebox&amp;quot;&lt;br /&gt;
| class=&amp;quot;code&amp;quot; |&lt;br /&gt;
 &amp;lt;span class=&amp;quot;comm&amp;quot;&amp;gt;// pointers to base class&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span class=&amp;quot;prep&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;#include &amp;lt;iostream&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;using&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;namespace&amp;lt;/span&amp;gt; std;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;protected&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; width, height;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt; set_values (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; a, &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; b)&lt;br /&gt;
       { width=a; height=b; }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CRectangle: &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area ()&lt;br /&gt;
       { &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; (width * height); }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CTriangle: &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area ()&lt;br /&gt;
       { &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; (width * height / 2); }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; main () {&lt;br /&gt;
   CRectangle rect;&lt;br /&gt;
   CTriangle trgl;&lt;br /&gt;
   CPolygon * ppoly1 = &amp;amp;rect;&lt;br /&gt;
   CPolygon * ppoly2 = &amp;amp;trgl;&lt;br /&gt;
   ppoly1-&amp;gt;set_values (4,5);&lt;br /&gt;
   ppoly2-&amp;gt;set_values (4,5);&lt;br /&gt;
   cout &amp;lt;&amp;lt; rect.area() &amp;lt;&amp;lt; endl;&lt;br /&gt;
   cout &amp;lt;&amp;lt; trgl.area() &amp;lt;&amp;lt; endl;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
| class=&amp;quot;result&amp;quot; |&lt;br /&gt;
 20&lt;br /&gt;
 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In function &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, we create two pointers that point to objects of class &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt; (&amp;lt;tt&amp;gt;ppoly1&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ppoly2&amp;lt;/tt&amp;gt;). Then we assign references to &amp;lt;tt&amp;gt;rect&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;trgl&amp;lt;/tt&amp;gt; to these pointers, and because both are objects of classes derived from &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt;, both are valid assignations.&lt;br /&gt;
&lt;br /&gt;
The only limitation in using &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;*ppoly1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;*ppoly2&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;rect&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;trgl&amp;lt;/tt&amp;gt; is that both &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;*ppoly1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;*ppoly2&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; are of type &amp;lt;tt&amp;gt;CPolygon*&amp;lt;/tt&amp;gt; and therefore we can only use these pointers to refer to the members that &amp;lt;tt&amp;gt;CRectangle&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CTriangle&amp;lt;/tt&amp;gt; inherit from &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt;. For that reason when we call the &amp;lt;tt&amp;gt;area()&amp;lt;/tt&amp;gt; members at the end of the program we have had to use directly the objects &amp;lt;tt&amp;gt;rect&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;trgl&amp;lt;/tt&amp;gt; instead of the pointers &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;*ppoly1&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;*ppoly2&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In order to use &amp;lt;tt&amp;gt;area()&amp;lt;/tt&amp;gt; with the pointers to class &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt;, this member should also have been declared in the class &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt;, and not only in its derived classes, but the problem is that &amp;lt;tt&amp;gt;CRectangle&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CTriangle&amp;lt;/tt&amp;gt; implement different versions of &amp;lt;tt&amp;gt;area&amp;lt;/tt&amp;gt;, therefore we cannot implement it in the base class. This is when virtual members become handy:&lt;br /&gt;
&lt;br /&gt;
===Virtual members===&lt;br /&gt;
&lt;br /&gt;
A member of a class that can be redefined in its derived classes is known as a virtual member. In order to declare a member of a class as virtual, we must precede its declaration with the keyword &amp;lt;tt&amp;gt;virtual&amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;codebox&amp;quot;&lt;br /&gt;
| class=&amp;quot;code&amp;quot; |&lt;br /&gt;
 &amp;lt;span class=&amp;quot;comm&amp;quot;&amp;gt;// virtual members&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span class=&amp;quot;prep&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;#include &amp;lt;iostream&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;using&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;namespace&amp;lt;/span&amp;gt; std;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;protected&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; width, height;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt; set_values (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; a, &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; b)&lt;br /&gt;
       { width=a; height=b; }&lt;br /&gt;
     &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;virtual&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area ()&lt;br /&gt;
       { &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; (0); }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CRectangle: &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area ()&lt;br /&gt;
       { &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; (width * height); }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CTriangle: &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area ()&lt;br /&gt;
       { &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; (width * height / 2); }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; main () {&lt;br /&gt;
   CRectangle rect;&lt;br /&gt;
   CTriangle trgl;&lt;br /&gt;
   CPolygon poly;&lt;br /&gt;
   CPolygon * ppoly1 = &amp;amp;rect;&lt;br /&gt;
   CPolygon * ppoly2 = &amp;amp;trgl;&lt;br /&gt;
   CPolygon * ppoly3 = &amp;amp;poly;&lt;br /&gt;
   ppoly1-&amp;gt;set_values (4,5);&lt;br /&gt;
   ppoly2-&amp;gt;set_values (4,5);&lt;br /&gt;
   ppoly3-&amp;gt;set_values (4,5);&lt;br /&gt;
   cout &amp;lt;&amp;lt; ppoly1-&amp;gt;area() &amp;lt;&amp;lt; endl;&lt;br /&gt;
   cout &amp;lt;&amp;lt; ppoly2-&amp;gt;area() &amp;lt;&amp;lt; endl;&lt;br /&gt;
   cout &amp;lt;&amp;lt; ppoly3-&amp;gt;area() &amp;lt;&amp;lt; endl;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
| class=&amp;quot;result&amp;quot; |&lt;br /&gt;
 20&lt;br /&gt;
 10&lt;br /&gt;
 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Now the three classes (&amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;CRectangle&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CTriangle&amp;lt;/tt&amp;gt;) have all the same members: &amp;lt;tt&amp;gt;width&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;height&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;set_values()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;area()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The member function &amp;lt;tt&amp;gt;area()&amp;lt;/tt&amp;gt; has been declared as virtual in the base class because it is later redefined in each derived class. You can verify if you want that if you remove this &amp;lt;tt&amp;gt;virtual&amp;lt;/tt&amp;gt; keyword from the declaration of &amp;lt;tt&amp;gt;area()&amp;lt;/tt&amp;gt; within &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt;, and then you run the program the result will be  for the three polygons instead of &amp;lt;tt&amp;gt;20&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;10&amp;lt;/tt&amp;gt; and . That is because instead of calling the corresponding &amp;lt;tt&amp;gt;area()&amp;lt;/tt&amp;gt; function for each object (&amp;lt;tt&amp;gt;CRectangle::area()&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;CTriangle::area()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CPolygon::area()&amp;lt;/tt&amp;gt;, respectively), &amp;lt;tt&amp;gt;CPolygon::area()&amp;lt;/tt&amp;gt; will be called in all cases since the calls are via a pointer whose type is &amp;lt;tt&amp;gt;CPolygon*&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Therefore, what the &amp;lt;tt&amp;gt;virtual&amp;lt;/tt&amp;gt; keyword does is to allow a member of a derived class with the same name as one in the base class to be appropriately called from a pointer, and more precisely when the type of the pointer is a pointer to the base class but is pointing to an object of the derived class, as in the above example.&lt;br /&gt;
&lt;br /&gt;
A class that declares or inherits a virtual function is called a &amp;#039;&amp;#039;polymorphic class&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Note that despite of its virtuality, we have also been able to declare an object of type &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt; and to call its own &amp;lt;tt&amp;gt;area()&amp;lt;/tt&amp;gt; function, which always returns 0.&lt;br /&gt;
&lt;br /&gt;
===Abstract base classes===&lt;br /&gt;
&lt;br /&gt;
Abstract base classes are something very similar to our &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt; class of our previous example. The only difference is that in our previous example we have defined a valid &amp;lt;tt&amp;gt;area()&amp;lt;/tt&amp;gt; function with a minimal functionality for objects that were of class &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt; (like the object &amp;lt;tt&amp;gt;poly&amp;lt;/tt&amp;gt;), whereas in an abstract base classes we could leave that &amp;lt;tt&amp;gt;area()&amp;lt;/tt&amp;gt; member function without implementation at all. This is done by appending &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;=0&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; (equal to zero) to the function declaration.&lt;br /&gt;
&lt;br /&gt;
An abstract base CPolygon class could look like this:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;snippet&amp;quot;&lt;br /&gt;
| class=&amp;quot;code&amp;quot; |&lt;br /&gt;
 &amp;lt;span class=&amp;quot;comm&amp;quot;&amp;gt;// abstract class CPolygon&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;protected&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; width, height;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt; set_values (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; a, &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; b)&lt;br /&gt;
       { width=a; height=b; }&lt;br /&gt;
     &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;virtual&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area () =0;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notice how we appended &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;=0&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;virtual int area ()&amp;lt;/tt&amp;gt; instead of specifying an implementation for the function. This type of function is called a &amp;#039;&amp;#039;pure virtual function&amp;#039;&amp;#039;, and all classes that contain at least one pure virtual function are &amp;#039;&amp;#039;abstract base classes&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
The main difference between an abstract base class and a regular polymorphic class is that because in abstract base classes at least one of its members lacks implementation we cannot create instances (objects) of it.&lt;br /&gt;
&lt;br /&gt;
But a class that cannot instantiate objects is not totally useless; We can create pointers to it and take advantage of all its polymorphic abilities. Therefore a declaration like:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;snippet&amp;quot;&lt;br /&gt;
| class=&amp;quot;code&amp;quot; |&lt;br /&gt;
 CPolygon poly;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
would not be valid for the abstract base class we have just declared, because tries to instantiate an object. Nevertheless, the following pointers:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;snippet&amp;quot;&lt;br /&gt;
| class=&amp;quot;code&amp;quot; |&lt;br /&gt;
 CPolygon * ppoly1;&lt;br /&gt;
 CPolygon * ppoly2;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
would be perfectly valid.&lt;br /&gt;
&lt;br /&gt;
This is so for as long as &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt; includes a pure virtual function and therefore it&amp;#039;s an abstract base class. However, pointers to this abstract base class can be used to point to objects of derived classes.&lt;br /&gt;
&lt;br /&gt;
Here you have the complete example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;codebox&amp;quot;&lt;br /&gt;
| class=&amp;quot;code&amp;quot; |&lt;br /&gt;
 &amp;lt;span class=&amp;quot;comm&amp;quot;&amp;gt;// abstract base class&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;prep&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;#include &amp;lt;iostream&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;using&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;namespace&amp;lt;/span&amp;gt; std;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;protected&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; width, height;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt; set_values (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; a, &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; b)&lt;br /&gt;
       { width=a; height=b; }&lt;br /&gt;
     &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;virtual&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;) =0;&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CRectangle: &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;)&lt;br /&gt;
       { &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; (width * height); }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CTriangle: &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;)&lt;br /&gt;
       { &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; (width * height / 2); }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; main () {&lt;br /&gt;
   CRectangle rect;&lt;br /&gt;
   CTriangle trgl;&lt;br /&gt;
   CPolygon * ppoly1 = &amp;amp;rect;&lt;br /&gt;
   CPolygon * ppoly2 = &amp;amp;trgl;&lt;br /&gt;
   ppoly1-&amp;gt;set_values (4,5);&lt;br /&gt;
   ppoly2-&amp;gt;set_values (4,5);&lt;br /&gt;
   cout &amp;lt;&amp;lt; ppoly1-&amp;gt;area() &amp;lt;&amp;lt; endl;&lt;br /&gt;
   cout &amp;lt;&amp;lt; ppoly2-&amp;gt;area() &amp;lt;&amp;lt; endl;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
| class=&amp;quot;result&amp;quot; |&lt;br /&gt;
 20&lt;br /&gt;
 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If you review the program you will notice that we refer to objects of different but related classes using a unique type of pointer (&amp;lt;tt&amp;gt;CPolygon*&amp;lt;/tt&amp;gt;). This can be tremendously useful. For example, now we can create a function member of the abstract base class &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt; that is able to print on screen the result of the &amp;lt;tt&amp;gt;area()&amp;lt;/tt&amp;gt; function even though &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt; itself has no implementation for this function:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;codebox&amp;quot;&lt;br /&gt;
| class=&amp;quot;code&amp;quot; |&lt;br /&gt;
 &amp;lt;span class=&amp;quot;comm&amp;quot;&amp;gt;// pure virtual members can be called&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span class=&amp;quot;comm&amp;quot;&amp;gt;// from the abstract base class&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;prep&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;#include &amp;lt;iostream&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;using&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;namespace&amp;lt;/span&amp;gt; std;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;protected&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; width, height;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt; set_values (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; a, &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; b)&lt;br /&gt;
       { width=a; height=b; }&lt;br /&gt;
     &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;virtual&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;) =0;&lt;br /&gt;
     &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt; printarea (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;)&lt;br /&gt;
       { cout &amp;lt;&amp;lt; &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;this&amp;lt;/span&amp;gt;-&amp;gt;area() &amp;lt;&amp;lt; endl; }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CRectangle: &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;)&lt;br /&gt;
       { &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; (width * height); }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CTriangle: &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;)&lt;br /&gt;
       { &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; (width * height / 2); }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; main () {&lt;br /&gt;
   CRectangle rect;&lt;br /&gt;
   CTriangle trgl;&lt;br /&gt;
   CPolygon * ppoly1 = &amp;amp;rect;&lt;br /&gt;
   CPolygon * ppoly2 = &amp;amp;trgl;&lt;br /&gt;
   ppoly1-&amp;gt;set_values (4,5);&lt;br /&gt;
   ppoly2-&amp;gt;set_values (4,5);&lt;br /&gt;
   ppoly1-&amp;gt;printarea();&lt;br /&gt;
   ppoly2-&amp;gt;printarea();&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; 0;&lt;br /&gt;
 }&lt;br /&gt;
| class=&amp;quot;result&amp;quot; |&lt;br /&gt;
 20&lt;br /&gt;
 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Virtual members and abstract classes grant C++ the polymorphic characteristics that make object-oriented programming such a useful instrument in big projects. Of course, we have seen very simple uses of these features, but these features can be applied to arrays of objects or dynamically allocated objects.&lt;br /&gt;
&lt;br /&gt;
Let&amp;#039;s end with the same example again, but this time with objects that are dynamically allocated:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;codebox&amp;quot;&lt;br /&gt;
| class=&amp;quot;code&amp;quot; |&lt;br /&gt;
 &amp;lt;span class=&amp;quot;comm&amp;quot;&amp;gt;// dynamic allocation and polymorphism&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;prep&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;#include &amp;lt;iostream&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;using&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;namespace&amp;lt;/span&amp;gt; std;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;protected&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; width, height;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt; set_values (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; a, &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; b)&lt;br /&gt;
       { width=a; height=b; }&lt;br /&gt;
     &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;virtual&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;) =0;&lt;br /&gt;
     &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt; printarea (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;)&lt;br /&gt;
       { cout &amp;lt;&amp;lt; &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;this&amp;lt;/span&amp;gt;-&amp;gt;area() &amp;lt;&amp;lt; endl; }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CRectangle: &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;)&lt;br /&gt;
       { &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; (width * height); }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;class&amp;lt;/span&amp;gt; CTriangle: &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt; CPolygon {&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;&amp;lt;nowiki&amp;gt;:&lt;br /&gt;
     &amp;lt;/nowiki&amp;gt;&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; area (&amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;void&amp;lt;/span&amp;gt;)&lt;br /&gt;
       { &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; (width * height / 2); }&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; main () {&lt;br /&gt;
   CPolygon * ppoly1 = &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;new&amp;lt;/span&amp;gt; CRectangle;&lt;br /&gt;
   CPolygon * ppoly2 = &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;new&amp;lt;/span&amp;gt; CTriangle;&lt;br /&gt;
   ppoly1-&amp;gt;set_values (4,5);&lt;br /&gt;
   ppoly2-&amp;gt;set_values (4,5);&lt;br /&gt;
   ppoly1-&amp;gt;printarea();&lt;br /&gt;
   ppoly2-&amp;gt;printarea();&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;delete&amp;lt;/span&amp;gt; ppoly1;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;delete&amp;lt;/span&amp;gt; ppoly2;&lt;br /&gt;
   &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
| class=&amp;quot;result&amp;quot; |&lt;br /&gt;
 20&lt;br /&gt;
 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Notice that the &amp;lt;tt&amp;gt;ppoly&amp;lt;/tt&amp;gt; pointers:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;snippet&amp;quot;&lt;br /&gt;
| class=&amp;quot;code&amp;quot; |&lt;br /&gt;
 CPolygon * ppoly1 = &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;new&amp;lt;/span&amp;gt; CRectangle;&lt;br /&gt;
 CPolygon * ppoly2 = &amp;lt;span class=&amp;quot;kw&amp;quot;&amp;gt;new&amp;lt;/span&amp;gt; CTriangle;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
are declared being of type pointer to &amp;lt;tt&amp;gt;CPolygon&amp;lt;/tt&amp;gt; but the objects dynamically allocated have been declared&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
</feed>