bryan@UUNET.UU.NET (Bryan Boreham) (06/18/89)
// This is derived from a problem that I came across when porting ET++
// to g++ 1.35.1-.
#include <stdio.h>
class Base
{
public:
Base();
Base(int t) { }
virtual void print() { printf("I'm a Base.\n"); }
};
class Derived : public Base
{
public:
Derived(int t) : (t) { }
void print() { printf("I'm a Derived.\n"); }
};
void MakeDer(Base **d)
{
*d = new Derived(3);
}
Base::Base()
{
Base* tmp_this;
MakeDer(&tmp_this);
tmp_this->print(); // I'm a Derived .
this = tmp_this; // now it stuffs the vptr in
this->print(); // I'm a Base.
}
int main()
{
Base* b = new Base;
b->print(); // I'm a Base.
delete b;
return 1;
}
The idea is that Base should actually construct a Derived when called
by new. ET++ uses a technique like this to make things like Font,
Bitmap etc., window-system independant, but they used cfront, which
apparently lets them call MakeDer(&this). I don't have access to a
cfront compiler, so I can't check what this does.
Anyway, g++ won't allow "&this", so I tried code like the above. Many
wierd things happened, and I traced it to the fact that g++ stuffs in
the vptr for Base after the first assignment to "this". If the
assignment is in an if statement, the vptr gets set after the whole if.
I am currently working round this by saving the value of the vptr as
it comes from the desired class, and re-setting it after g++ has
clobbered it, but I'd like to know what should really be happening.
Perhaps there should be a way to take the address of "this"? Or a way
to stop the vptr assignment? Maybe I missed the whole point.
Bryan Boreham bryan@kewill.uucp or kewill!bryan@uunet.UU.NET
Software Engineer {Atlantic Ocean} ... !mcvax!ukc!root44!kewill!bryan
Kewill Systems PLC Work: (+44) 932 248 328
Walton-On-Thames
Surrey KT12 2QS This is National No Quotes Week in Walton.
England