On Thursday, 20 December 2012 at 20:58:40 UTC, Benjamin Thaut wrote:
Am 20.12.2012 20:12, schrieb foobar:>
> This argument is false.
>
> With the current "usual" design:
> Base instance = new Derived();
> instance.method(); // #1
>
> With Beta design:
> Base instance = new Derived();
> instance.method(); // #2
>
> In case #1, the call to method itself is virtual while the
call to super
> is not, whereas in case #2 the call to method is _not_
virtual, but the
> call to inner is virtual. Either way you get one virtual
call. The
> difference is the direction of the calls.

No its not, if you have a chain that is longer than just 1 you will have more virtual calls in the inner case.

Kind Regards
Benjamin Thaut

well, if the library developer wants to gain full control of that long call chain than yes, it will come with a certain price. The same price if you design the same way in C++. In practice however how common are those chains and how long are they? As far as I'm aware, inheritance of concrete classes has mostly fallen out of favor nowadays so practically speaking this is still insignificant.

Btw, This reminds me the OO class in university which makes it very clear that the C++/Java/C#/etc variant of inheritance is inherently flawed. It conflates two orthogonal concerns - sub-typing and sub-classing. Small-talk for example is dynamically typed so inheritance only serves the sub-classing concern. Interfaces in Java where designed to serve only the sub-typing concern.

I find Rust's trait system fascinating precisely because they realized this and did not repeat the same old mistake. They haven't addressed fully the sub-classing relation yet but I'm eagerly awaiting any developments in that area.

Reply via email to