You are on page 1of 4

Date 10-02-2023

--------------------------

Multiple Inheritence where a subclass will have two or more base classes.

example :
A B
| |
|____________|
|
C

class C : public A,public B


{

};

class base1
{
protected:
int iVar1;
public:
void show_1()
{
cout<<iVar1 <<endl;
}
};
class base2
{
protected:
int iVar2;
public:
void show_2()
{
cout<<iVar2<<endl;
}
};

class derived:public base1,public base2


{
public:
void set(int iTx,int iTy)
{
iVar1=iTx; iVar2=iTy;
}
};
int main()
{
derived Dvar; Dvar.set(10,20);
Dvar.show_1(); Dvar.show_2();
return 0;
}

Ambiguities (confusion) in Multiple Inheritence


-----------------------------------
1) can arise if two bases classes have same method

class base1
{
protected:
int iVar1;
public:
void show()
{
cout<<iVar1 <<endl;
}
};
class base2
{
protected:
int iVar2;
public:
void show()
{
cout<<iVar2<<endl;
}
};

class derived:public base1,public base2


{
public:
void set(int iTx,int iTy)
{
iVar1=iTx; iVar2=iTy;
}
};
int main()
{
derived Dvar; Dvar.set(10,20);
Dvar.show; // will give error of ambiguious call
return 0;
}

// The above error can be solved in two ways


A) using scope resolution operator ::
B) by overriding the method of base class again into derived class

A)
int main()
{
derived Dvar;
Dvar.base1::show();
Dvar.base2::show();
return 0;
}
B)
class derived:public base1,public base2
{
public:
void set(int iTx,int iTy)
{
iVar1=iTx; iVar2=iTy;
}
void show() // method overriding
{
base1::show();
base2::show();
}
};

2) can arise when the derived class has multiple copies of the same base class

A
|
_______|_________
| |
B C
|________________|
|
D
here D will have two copies of class A ie
via class B and via class C

The above problem can be resolved in following ways


a) using scope resolution operator
class A
{
public:
void show()
{ cout<<endl<<"A"; }
};
class B: public A
{
};
class C: public A
{
};
class D:public B,public C
{
};
int main()
{
D d1;// d1.show();
d1.B::show();
return 0;
}
b) using virtual base class

class A
{
public:
void show()
{ cout<<endl<<"A"; }
};
class B:virtual public A
{
};
class C: virtual public A
{
};
class D:public B,public C
{
};
int main()
{
D d1; d1.show();
return 0;
}

You might also like