Re: Deriving from concrete types
Kirit S?lensminde wrote:
There are three things here:
* OO inclusional polymorphism - that a sub-class can be substituted for
a super-class. Where we pass pointers & references and use virtual
functions.
* Operational polymorphism - where we define the interface. As used by
templates.
* Convenience - where a class does most of what we want, but we want to
change it a litle.
That's a nice terse characterization. Dwelling a bit on the first bullet
point, I was surprised at a point to realize that true polymorphism
"restricts" through inheritance; it does not "extend" at all. Java
pushed the confusion further by making "extends" a keyword. This way,
many beginners and even advanced programmers (as I thought I was when I
realized the mistake of my thinking) sdtrongly believe that the OOP way
is, you start with a "little" class and you "extend" it by adding
variables and functions.
In reality, true dynamic polymorphism is inclusion polymorphism: a base
class stands in as the most general concept, that _includes_ all of the
possible concepts inheriting it. From a member variables perspective,
the base class represents anything that has those members _and more_.
Therefore, as soon as you inherit a base and add your own member
variables, you actually restrict the generality of the base class, not
extend it.
So a Circle does not "extend" a Shape because the Shape is a more
general concept. It "particularizes" it. Same about ColoredPoint versus
Point. This is because Point represents a point that may be colored or
not, while ColoredPoint is just a subset of that set - a point that's
definitely colored.
These details are not directly related to the OP's question, but I
thought it's a nice opportunity to mention the set relationship modeled
in C++ by public inheritance.
Andrei
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]