Home Accessibility Courses Twitter The Mouth Facebook Resources Site Map About Us Contact
 
For 2023 (and 2024 ...) - we are now fully retired from IT training.
We have made many, many friends over 25 years of teaching about Python, Tcl, Perl, PHP, Lua, Java, C and C++ - and MySQL, Linux and Solaris/SunOS too. Our training notes are now very much out of date, but due to upward compatability most of our examples remain operational and even relevant ad you are welcome to make us if them "as seen" and at your own risk.

Lisa and I (Graham) now live in what was our training centre in Melksham - happy to meet with former delegates here - but do check ahead before coming round. We are far from inactive - rather, enjoying the times that we are retired but still healthy enough in mind and body to be active!

I am also active in many other area and still look after a lot of web sites - you can find an index ((here))
C++ - objects that are based on other objects, saving coding and adding robustness

In a previous article ([here]), I talked about how we introduce the basic concepts of classes, methods and objects on our C++ courses. I'm now going to give you some links to the next series of example which I wrote during that same course.

Having covered object basics, we moved on to look at related types of objects. I had taken trains as my first example, and I wanted to move on to cover public transport in general. There are more similarities than there are differences between the use of a bus and a train (and a ferry!) and so it would be a great shame to duplicate program code. The duplication would be quick and easy enough, but then any future updates / corrections / enhancements would have to be made to to each copy, and that's going to get ver inefficient. So we create what's known as a "base class" which includes all the common stuff, and then a series of "subclasses" each of which contains the the extras or the stuff that varies.

How does this work at run time? When you call a method on an object, it looks within the functions defined for that object type. If the method isn't there, it looks in the parent class (i.e. the common base), an dif it's not there it looks in the parent's parent, and so on. Very neat, great to write, but you do need to document what you're doing fairly carefully so that you can find out where a particular functionallity has come from later on!.

There's a first example from the course [here]; my base class is called "Ptrans" for Public Transport, and I have got two subclasses (also know as extended classes) - one each for a Bus and a Train. A lot of the code can be common to Ptrans, but when it comes to working out the number of drivers required for a certain number of vehicles, it's one per vehicle on the road, but one per whole series of vehicles on the railway. A setup like this, where the code is selected as the program runs depending on the type of object it's being run on, is called polymorphism. You won't find the word declared in the source code - it's a useful side effect of the design method used.


Where we want to hold a whole array of objects of similar type (i.e. based on the same base class), we can do so. And we've an example of that in source code [here]. But there are a couple of extras you need in C++.

1. If you're going to set up an array containing different object types, you need to declare the array to be of the type of a common parent. Thus - an array of pointers to Ptrans in our example

2. If you're calling any methods which ONLY exist in the subclasses (such as getting the number of drivers, where there is no common code but you'll have an algorithm for EVERY vehicle type), you need to declare virtual methods in your base class. You're turning it into what's known as an abstract class (i.e. you can't have any pieces of Public Transport which are NOT defined by a subclass)

You can have methods that work on an object (they're know as dynamic or object methods), and you can also have methods that work on the class as a whole (they're known as static method or class methods) - but what if you want to write a method which works on two objects - for example to compare them. "Which has the higher capacity?". That's something that I added to the third example in this series - source code [here].

The 'trick' - if you would like to call it a trick - is to pass in one object as a parameter to an object method - thus:
  options[2]->compare(options[0])
to compare two specific members of an array of Ptrans object known as options. By careful codeing, you can use a method in the base class to compare two different objects based on a polymorphic criterion of your choice - our example returns the object with the higher passenger capacity in this example.

You may at first wonder why I used the word that for my parameter ... I did that simpley because the object on which the call is based is called this (a reserved word in C++), and it adds a neat understandability and symmetry to have the second thing that's being compared known as that.

The example goes on to include a static method (I called it mostyn for a reason that's already lost in time!) which looks for the highest capacity in a whole array of objects. Mostyn calls compare ... which calld getcapacity for each individual object. It's a neat tree which, once again, show how code is being shared and should only be written once. Algorithms can easily be changed later, at a single stroke, and retesting is easy. You'll score high in the coding stakes, and high in consistency and reliability too using this approach.


P.S. ... extra example, showing how to write a destructor in C++ - [here]. If you want to add some extra activities when you've finished with an object (such as flushing changes made to a copy of the data help in memory back to a database) you may do so via a destructor. Destructors are odd in that you don't necessarily have to call them directly - they may be called and run automatically when a variable goes out of scope.
(written 2011-04-17)

 
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
Q909 - Object Orientation and General technical topics - Object Orientation: Composite Objects
  [477] Class, static and unbound variables - (2005-10-25)
  [592] NOT Gone phishing - (2006-02-05)
  [1345] Perl and Shell coding standards / costs of an IT project - (2007-09-11)
  [1348] Screw it or Glue it? Access to Object variables - a warning - (2007-09-12)
  [2170] Designing a heirarcy of classes - getting inheritance right - (2009-05-11)
  [2641] Object Oriented Programming in PHP - (2010-02-19)
  [2865] Relationships between Java classes - inheritance, packaging and others - (2010-07-10)
  [2922] Getting the OO design write - with PHP a example - (2010-08-14)
  [3142] Private and Public - and things between - (2011-01-22)
  [3152] Jargon busting - (2011-01-30)
  [3609] How do classes relate to each other? Associated Classes - (2012-02-12)
  [3979] Extended and Associated objects - what is the difference - C++ example - (2013-01-18)
  [4377] Designing a base class and subclasses, and their extension, in C++ - (2015-01-01)
  [4394] Philosophy behind object design - and how I applied in to a Java example - (2015-01-14)
  [4450] Deciding whether to use parameters, conditional statements or subclasses - (2015-03-05)

C233 - C and C based languages - OO in C++ - beyond the basics
  [798] References and Pointers in C++ - (2006-07-10)
  [801] Simple polymorphism example - C++ - (2006-07-14)
  [831] Comparison of Object Oriented Philosophy - Python, Java, C++, Perl - (2006-08-13)
  [925] C++ - just beyond the basics. More you can do - (2006-11-14)
  [1217] What are factory and singleton classes? - (2007-06-04)
  [1572] C - structs and unions, C++ classes and polymorphism - (2008-03-13)
  [1674] What a lot of files! (C++ / Polymorphism demo) - (2008-06-12)
  [1819] Calling base class constructors - (2008-10-03)
  [2577] Complete teaching example - C++, inheritance, polymorphism - (2010-01-15)
  [2845] Objects and Inheritance in C++ - an easy start - (2010-07-01)
  [3056] C++ - a complete example with polymorphism, and how to split it into project files - (2010-11-16)
  [3123] C++ objects - some short, single file demonstrations - (2011-01-07)
  [3124] C++ - putting the language elements together into a program - (2011-01-08)
  [3244] C and C++ - preprocess, compile, load, run - what each step is for - (2011-04-12)
  [3508] Destructor methods in C++ - a primer - (2011-11-05)
  [3811] Associated Classes - using objects of one class within another - (2012-07-21)
  [4356] Object factories in C++, Python, PHP and Perl - (2014-12-19)
  [4375] Final examples for 2014 - and a look at our 2015 training course options - (2014-12-31)
  [4559] When do I use the this keyword in C++? - (2015-10-29)
  [4560] Variables, Pointers and References - C and C++ - (2015-10-29)


Back to
C++ - how we teach the language and the concepts behind the language
Previous and next
or
Horse's mouth home
Forward to
C++ - unknown array size, unknown object type. Help!
Some other Articles
Process every member of an array, and sort an array - Ruby
Multiple inputs, multiple out, ruby functions
Is this number between? Does this list include? - Ruby
C++ - unknown array size, unknown object type. Help!
C++ - objects that are based on other objects, saving coding and adding robustness
C++ - how we teach the language and the concepts behind the language
Events - Spring and Early Summer 2011 in Melksham
What have these pictures in common?
Light and dark at Green Park
Melksham - the way forward. 26th April, Well House Manor
4759 posts, page by page
Link to page ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96 at 50 posts per page


This is a page archived from The Horse's Mouth at http://www.wellho.net/horse/ - the diary and writings of Graham Ellis. Every attempt was made to provide current information at the time the page was written, but things do move forward in our business - new software releases, price changes, new techniques. Please check back via our main site for current courses, prices, versions, etc - any mention of a price in "The Horse's Mouth" cannot be taken as an offer to supply at that price.

Link to Ezine home page (for reading).
Link to Blogging home page (to add comments).

You can Add a comment or ranking to this page

© WELL HOUSE CONSULTANTS LTD., 2024: 48 Spa Road • Melksham, Wiltshire • United Kingdom • SN12 7NY
PH: 01144 1225 708225 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho

PAGE: http://www.wellho.net/mouth/3251_C-o ... tness.html • PAGE BUILT: Sun Oct 11 16:07:41 2020 • BUILD SYSTEM: JelliaJamb