You're viewing a comment by fulano and its responses.
You're viewing a comment by fulano and its responses.
I am being sponsored by Syntress! They bought me an amazing dedicated server to run catonmat on. If you're looking web services, I highly recommend the Syntress guys!
I am being sponsored by A-Writer! If you ever need help with essay writing, look no further than A-Writer! They will help you with your writing in as quickly as 3 hours!
I love to read science books. They make my day and I get ideas for awesome blog posts, such as Busy Beaver, On Functors, Recursive Regular Expressions and many others.
Take a look at my
Amazon wish list, if you're curious about what I have planned reading next, and want to surprise me. :)
If you are interested in advertising on catonmat.net, contact me.
Free tools for coding on Vietstarsoft.com.
Programming homework help.


The way I see it is that there are two orthogonal axes here: polymorphism kind (ad-hoc vs parametric), and mechanism kind (dynamic vs static).
In parametric polymorphism the code works with an unlimited set of (variable, parametrized) types, and the behaviour is essentially identical for all of those types.
Contrast this with ad-hoc polymorphism, where there is a limited, enumerated set of types which are usable in the context, and the behaviour of the code varies as those types change.
On the other axis, dynamic vs static refers to whether the mechanisms which implement the polymorphism are run-time or compile-times ones.
In C++ this leads us to the following classifications:
Subclassing: dynamic, ad-hoc (NB it's only dynamic in the case of virtual functions)
Templates: static, parametric
Overloading: static, ad-hoc
(Can't think of a built-in, dynamic, parametric polymorphism in C++.)
Introduce template specialization, and you start mixing in ad-hoc features into the parametric polymorphism.
I don't really think that it is meaningful to think of casting as a kind of polymorphism.
Comment Responses
That's a cool way of viewing it. I hadn't thought about it before. Thanks for sharing this view.
Casting any pointer to void* could be considered a limited form of built-in, dynamic, parametric polymorphism.
By stretching things a bit further, you could even see const_cast and reinterpret_cast as falling into the same category.
Agreed. However,
a) inheritance and virtual functions
b) function overloading
c) templates
are all built-in mechanisms for the *creation* of new polymorphic components in a C++ program. These casts simply *are* polymorphic components: you have no means of extending the set.
You could argue that you can use them (especially the void*) to create new polymorphic components, but then *I* wouldn't call it a built-in mechanism any more (it becomes a Turing-trivial argument).
Still, I appreciate the observation. I hadn't thought of the casts in this light before.
Reply To This Comment