Re: ambiguous access of 'Base' ??
Mario Semo wrote:
Hello,
Sample : class "Derived" derives from Derive1 and from Derive2, and
both derive from Base.
now, Derived has a function "make2" which does
Base();
this results in a compile error :
ambiguous access of 'Base'
?
This call will call / has to call the constructor of Base. Where is
the ambiguity ?
Each of the subobjects of 'Derived' has its own 'Base', one is called
'Derived1::Base', the other is 'Derived2::Base'.
When either class 1 or class 2 do not derive from "base", there is no
problem anymore.
but, the 2 base classes "base" should not have anything to do with
the call to Base();
Here is the source:
#include <stdio.h>
static int _cnt;
class Base
{
//--------------------------------------------------------------------------
public:
//--------------------------------------------------------------------------
/// default constructor
Base()
{
printf("%p : %d : %d\n",this,__LINE__,_cnt++);
}
/// destructor
virtual ~Base()
{
}
};
class Derived1
public Base
{
//--------------------------------------------------------------------------
public:
//--------------------------------------------------------------------------
/// default constructor
Derived1()
{
printf("%p : %d : %d\n",this,__LINE__,_cnt++);
}
/// destructor
virtual ~Derived1()
{
}
};
class Derived2
public Base
{
//--------------------------------------------------------------------------
public:
//--------------------------------------------------------------------------
/// default constructor
Derived2()
{
printf("%p : %d : %d\n",this,__LINE__,_cnt++);
}
/// destructor
virtual ~Derived2()
{
}
};
class Derived
public Derived1
, public Derived2
{
//--------------------------------------------------------------------------
public:
//--------------------------------------------------------------------------
/// default constructor
Derived()
{
printf("%p : %d : %d\n",this,__LINE__,_cnt++);
}
/// destructor
virtual ~Derived()
{
}
Base make2();
};
Base Derived::make2()
{
return Base();
//aa.cpp(81) : error C2385: ambiguous access of 'Base'
// unable to recover from previous error(s); stopping
compilation }
You need to tell the compiler which of the two 'Base' types you
want created. You need to say
return Derived1::Base();
or
return Derived2::Base();
Alternatively, you can make 'Base' a virtual base class if you
define *both* Derived1 and Derived2 as
class Derived1 : public virtual Base
class Derived2 : public virtual Base
in which case 'Derived' will have only one subobject of type Base
in it. Read up on virtual inheritance.
int main(int argc,char *argv[])
{
Derived d;
printf("------------------\n");
d.make2();
printf("------------------\n");
return 0;
}
cl -W4 -nologo /J aa.cpp user32.lib
when i comment out the ":public Base" at "Derived2" then the code
compiles and the result is :
0012FF70 : 12 : 0
0012FF70 : 29 : 1
0012FF74 : 47 : 2
0012FF70 : 66 : 3
------------------
0012FF6C : 12 : 4
------------------
so, as expected, Derived::Derived1::Base has nothing to do with the
call to Base(), Base() creates a new item.
I don't understand that statement, sorry.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask