Re: Virtual function call from constructor
Mike Schilling wrote:
"Eric Sosman" <esosman@acm-dot-org.invalid> wrote in message
news:s9WdnYfKx8K5g-DbnZ2dnUVZ_u-unZ2d@comcast.com...
Daniel Kraft wrote:
Suppose the class has a non-overridable method (private, final,
or static) that performs some useful operation on an object. And
suppose this method uses overridable methods of the object. Do
you need to compile two variants of this method to make it behave
differently depending on whether there is or isn't a constructor
somewhere in its call stack? (In fact, "a constructor" isn't
enough, not even "a constructor of the same class." If I've got
a fully-constructed object A lying around and I call a method on
it while constructing another object B, I want that method to obey
the overrides when applied to object A but not to B. I'm not sure
it's even possible to sort that out entirely at compile time. I
think you'd need a "construction finished" flag on every object --
in fact, one such flag for every level of inheritance starting
from Object itself. "Don't Do That" seems a lot simpler ...)
Hm, that's a good point! I believe in C++ this is done by updating the
vtable for each constructor finished or something like this -- that
should also be fairly simple to implement and you do not need a
"construction finished" flag, but of couse it imposes some costs.
You are correct.
I don't know how C++ is implemented, but if the "vtable"
is a bunch of pointers to methods it sounds like you'd need a
per-instance edition of it to reflect the instance's fully-
or partially-constructed state. Sounds like a lot of bloat ...
Not per-instance, per-class. Assume S2 extends S1, and S1 extends S0. An
Sn constructor:
calls the superclass constructor (if there is a superclass)
points its vtable at the Sn version
runs its code
The result is that the constructor runs as if the object were the type being
constructed, and when all have run, the object is of the correct
(most-derived) type. No bloat involved. I always find it silly when people
who know nothing about a language assume that if it does things differently
from the languages they're used to, it must be stupid and inefficient to do
so.
Somehow I'm failing to find the word "stupid" or "inefficient"
in anything that I wrote. Could you help me with my proofreading,
please?
I *did* use the word "bloat," and it still seems justifiable.
The implementation you describe (if I've understood you correctly)
requires each instance to carry a pointer per inheritance level;
that's certainly larger than the one bit per level I described as
a hypothetical implementation, and that in turn is larger than
no per-instance "construction status" at all.
--
Eric Sosman
esosman@acm-dot-org.invalid