Re: Multiple inheritance and pointer equivalence
"Danny Woods" <dannywoodz@yahoo.co.uk> ha scritto nel messaggio
news:50skccrsex.fsf@gmail.com...
Hi all,
Given this simple program:
----
#include <cstdio>
class A { public: virtual ~A() {} };
class B { public: virtual ~B() {} };
class C : public A, public B { public: virtual ~C() {} };
int main(void)
{
C *c = new C();
A *a = c;
B *b = c;
printf("c: %p; a: %p; b: %p\n", c, a, b);
delete c;
return 0;
}
----
Is it to be expected that the addresses stored in a and b are different?
I've tried this with Visual C++ and Cygwin g++, with identical results.
The problem I have is that there are other subclasses of A and B that
are distinct, but that there's a special case where the combined
subclass, C, is required to fill both roles. When the code that cleans
up a and b runs later, I'll end up with double deletion unless I can
i not find in the example above no double free;
where is it?
Can i use "this" inside the distructor function?
------------------------------
#include <stdio.h>
#include <stdlib.h>
#define P printf
#define i8 signed char
class A{
public:
A(){ Aarr= (i8*) malloc(1024); }
virtual ~A()
{P("~A(); this=%p\n", this);
free(Aarr);
Aarr= (i8*) -1;
}
i8* Aarr;
};
class B{
public:
B(){ Barr= (i8*) malloc(1024); }
virtual ~B()
{P("~B(); this=%p\n", this);
free(Barr);
Barr= (i8*) -1;
}
i8* Barr;
};
class C : public A, public B{
public:
virtual ~C(){ P("~C(); this=%p\n", this); }
};
int main(void)
{ C *c = new C;
A *a = c;
B *b = c;
if(c->Aarr==0||c->Barr==0)
{P("No memory\n");
goto end;
}
printf("c: %p; a: %p; b: %p\n", c, a, b);
end:;
delete c;
P("END\n");
return 0;
}
------------------------------------
c: 00852FD4; a: 00852FD4; b: 00852FDC
~C(); this=00852FD4
~B(); this=00852FDC
~A(); this=00852FD4
END
reliably tell that a and b point to the same object, but the simple
'a == b' doesn't work here.
Cheers,
Danny.