Re: Is this like calling a virtual function at construction time?
On Jun 1, 1:58 am, Sam <saka...@yahoo.com> wrote:
Hello!
I frequently read that at construction time "*this" has the type of the
class being constructed at the moment. This is usually written in
conjunction with calling virtual functions from constructors.
My case seams similar to the above but is not exactly the same. The
following code depicts my case (sort of, but the C++ mechanics
involved are the same).
#include <iostream> // for std::cout
class IPure
{
public:
virtual void Work() = 0;
virtual ~IPure() {} // empty
};
class Base : public IPure
{
private:
IPure *next;
public:
Base() : next(this) {} // empty
void CallNextWork() { next->Work(); }
virtual void Work() { std::cout << "Base"; }
};
class Derived : public Base
{
public:
virtual void Work() { std::cout << "Derived"; }
};
int main()
{
Base *base = new Derived();
base->CallNextWork();
delete base;
return 0;
}
In the above code, I want Derived::Work to be called. And so it happens
with two compilers I've tested it.
But I wonder. Since Base::next is initialized at "Base"s
construction time, when its type is "Base", why is it that it works
the way I want?
It works the way you want because this and next are pointers, they
simply point to a piece of allocated memory, what the piece of memory
is filled with is up to the compiler. What happens is that in Base's
ctor you copy the address of this into next, so now they point to the
same memory. After new Derived() returns base, this and next will all
point to the same memory area, the area where the compiler just
created an object of the type Derived.
The problem you mention in the beginning of your message would occur
if you for instance called Work from Base's ctor which would invoke
Base::Work() and not Derived::Work() which might have been expected
and desired.
Can I rely on this behavior? What does the C++ standard say about this?
Yep, you can rely on this behaviour but you'll have to ask someone
else about what the standard says about it.
/Andreas
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]