[gnu.g++.bug] bug caused by multiple inheritance

chatty%FRLRI61.BITNET@CUNYVM.CUNY.EDU (06/05/89)

In the following example, a class B derives from a class A, and a class D derive
from class B and another class C. It seems that the presence of D confuses g++ 1
when managing simple inheritance of B from A : inherited members are called with
a wrong 'this' address.

% cat bug.cc
class A {
public:
                A () {};
        void    foo () { printf ("this = %x\n", this); }
};

class B : public A {
public:
                B () { printf ("this = %x\n", this); }
};

class C {
public:
        C ();
};

class D : public C, public B {
public :
                D ();
};


main ()
{
        B b;

        b.foo ();
}

% g++ -v -o bug bug.cc
g++ version 1.35.0+
 /usr/local/lib/GNU/cpp -+ -v -undef -D__GNU__ -D__GNUG__ -D__cplusplus -Dmc6800
0 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -Dmc68020 bug.cc /tmp/cca03288
.cpp
GNU CPP version 1.35
 /usr/local/lib/GNU/cc1plus /tmp/cca03288.cpp -quiet -dumpbase bug.cc -noreg -ve
rsion -o /tmp/cca03288.s
GNU C++ version 1.35.0+ (68k, MIT syntax) compiled by GNU C version 1.35.
In method void A::foo ():
bug.cc:4: warning: implicit declaration of function `printf'
 as -mc68020 /tmp/cca03288.s -o bug.o
 /usr/local/lib/GNU/ld++ -o bug -C /usr/local/lib/GNU/crt0+.o /lib/Fcrt1.o bug.o
 -lg++ /usr/local/lib/GNU/gnulib -lc

% bug
this = efffa86
this = efffa88

Surprising, ain't it ?

BTW, I would like more infos on the new 'protected virtual' feature. Is it norma
derived class cannot use the virtual functions of its base class ?

Stephane Chatty         chatty@frlri61.fr
                        chatty@lri.lri.fr

sacco@eileen.samsung.com (Joseph E. Sacco) (06/07/89)

In article <8906051539.AA18913@lri.lri.fr>, chatty%FRLRI61.BITNET@CUNYVM.CUNY.EDU writes:
> 
> In the following example, a class B derives from a class A, and a class D derive
> from class B and another class C. It seems that the presence of D confuses g++ 1
> when managing simple inheritance of B from A : inherited members are called with
> a wrong 'this' address.
> 

Another aspect of the bug is that not only does its existence depend upon
the declaration of D but also upon the order in which the parents of D are
specified. If that order is reversed the two values of "this" are seen to
be identical. Hmmmm ....................! What gives ?


						JOE