[omniORB] Ambiguous inheritance error

Rebecca.A.Sanford@notesmta.gd-is.com Rebecca.A.Sanford@notesmta.gd-is.com
Tue, 23 Feb 1999 11:08:44 -0600



Hi,

Sorry for bothering you again, but I'm a little confused by your
suggestion.  It sounds like you are suggesting an extra layer in
which the members of C_i would call the appropriate A_i and B_i member
functions.  That would add a lot of call overhead and I'm unclear how
constructors and destructors for A_i and B_i would be handled.

I have used similar IDL and header files with IONA's Orbix without a
problem.  I was attempting to port the code to omniORB to test for
interoperability between ORBs.  My actual code contains hundreds of
functions so perhaps you can understand my lack of eagerness to add
this extra layer.

If I'm way off-base, please let me know at your earliest convenience.
Thanks again for your time.

Becki Sanford
General Dynamics Information Systems
Bloomington, MN
email: r.sanford@gd-is.com






David Riddoch <djr@uk.research.att.com> on 02/23/99 03:54:00

To:   Rebecca A Sanford/GDIS/GDYN@GDIS
cc:   omniorb@uk.research.att.com
Subject:  Re: [omniORB] Ambiguous inheritance error





Hi Rebecca,


The reason you are having problems is that you are using C++ inheritance
to inherit both interface and implementation. The _sk_?? classes provide
part of the internal implementation of omniORB2, which is then provided
more than once if you inherit from multiple _sk_?? classes as you have
done.

The correct way to inherit the interface is as follows:

 // File: test_i.h
 #include "test.hh"

 class A_i : public Test::_sk_A {
   ... as you did ...
 };

 ... B similarly ...

 class C_i : public Test::_sk_C {
   void A_foo_1();
   void A_foo_2();
   void B_foo_1();
   void B_foo_2();
   void C_foo_1();
   void C_foo_2();
 };

The problem with this though is that we aren't inheriting the
implementation of A_foo_1() etc. You could achieve this by having separate
classes which provide the implementation for A and B, and have C_i inherit
from them. The implementations of A_foo_1() and friends would then just
delagate to that class.


Hope this helps,
David


PS. Its a good idea to send this sort of question to the mailing list, as
it would then be seen by a wider audience, and the answer may help others.



On Mon, 22 Feb 1999 Rebecca.A.Sanford@notesmta.gd-is.com wrote:

> Perhaps you can help me out with a problem I'm having with multiple
> inheritance with the omniORB (version 2.70). I'm compiling with MS
> Visual C++ 5.0 on NT 4.0.  My IDL is structured as follows:
>
>
>      // IDL
>      module Test {
>
>         interface A {
>            void A_foo_1 ();
>            void A_foo_2 ();
>         };
>
>         interface B {
>            void B_foo_1 ();
>            void B_foo_2 ();
>         };
>
>         interface C : A, B {
>            void C_foo_1 ();
>            void C_foo_2 ();
>         };
>      };
>
>
> I then created the following header file to define my classes:
>
>
>      // File: test_i.h
>      #include "test.hh"
>
>      class A_i : public virtual Test::_sk_A {
>      public:
>         void A_foo_1 ();
>         void A_foo_2 ();
>      };
>
>      class B_i : public virtual Test::_sk_B {
>      public:
>         void B_foo_1 ();
>         void B_foo_2 ();
>      };
>
>      class C_i : public virtual A_i,
>                  public virtual B_i,
>                  public virtual Test::_sk_C {
>      public:
>         void C_foo_1 ();
>         void C_foo_2 ();
>      };
>
>
> When I attempt to define an object of type "C_i", I get a compiler
> error stating that 'C_i' has ambiguous inheritances of _sk_C::dispatch
> and _sk_C::_widenFromTheMostDerivedIntf().
>
> Since the IDL compiler inserts those two functions, does this mean that
> I cannot use multiple inheritances?  Is there a workaround to this
> problem?  Any information you can toss my way will be greatly appreciated.
> Thank you in advance for your time and consideration.