Why multiple inheritance fails
I have following multiple inheritance logic
A
/ B C
\ /
D
here A B and C are pure abstract base classe and D is derived publicly(no
virtual inheritance ) from B and C and implements all pure virtual methods
of parent classes
I am able to call A::Method from
D* pD = new D;
B* b = pD;
C*c = pD;
c->method_of_A();
b->method_of_A();
but NOW !! in following scenerio
A
/ / \ \
/ \ \
B B2 C
\ / /
\ / /
\ /
\ /
D
here A, B, B2 AND C are pure virtual classes and D is derived publicly(no
virtual inheritance ) from B, B2 and C
now here I am not able to call A::Method from
D* pD = new D;
B* b = pD;
b->method_of_A();//not compiling ambiguous call
following is example
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// why multiple inheritance of interfaces (pure ABC) work when inheritance
hiearchy is liniear but fail when it involve loop
///
class Animal
{
public:
virtual void walk()=0;
};
class Cat : public Animal
{
public:
virtual void Meo()=0;
};
class PussyCat : public Animal
{
public:
virtual void PMeo()=0;
};
class persianCat: public PussyCat,public Cat
{
public:
virtual void PerMeo()=0;
};
class Dog : public Animal
{
public:
virtual void bark()=0;
};
class CatDog : public Dog,public persianCat
{
public:
void walk()
{
printf("Animal Walk");
}
void Meo()
{
printf("meo");
}
void PMeo()
{
printf("Pmeo");
}
void PerMeo()
{
printf("Permeo");
}
void bark()
{
printf("bhao bhao");
}
static CatDog* CreateInstance();
private :
CatDog(){};
};
CatDog* CatDog::CreateInstance()
{
return new CatDog;
}
int _tmain(int argc, _TCHAR* argv[])
{
persianCat* pPerCat = CatDog::CreateInstance();
CatDog* pCatDog = CatDog::CreateInstance();
pCatDog->walk();//Don't get error
pPerCat->walk(); //Get Error here why I don't know
delete pPerCat;
delete pCatDog;
return 0;
}