Virtual Inheritance:It is used when we have multiple copies of previous class properties or functions in inherited class.It is used mainly in diamond problem.
#include<iostream.h>
#include<conio.h>
class Student
{
protected: char name[20];
int roll;
public: void inputS();
void displayS();
};
void Student::inputS()
{
cout<<"Enter name:";
cin>>name;
cout<<"Enter roll number:";
cin>>roll;
}
void Student::displayS()
{
cout<<"Name:"<<name<<endl<<"Roll no:"<<roll<<endl;
}
class AcademicMarks:virtual public Student
{
protected: int math;
int physics;
int Computer;
public : void inputAca();
void displayAca();
};
void AcademicMarks::inputAca()
{
cout<<"Enter marks obtained in Math:";
cin>>math;
cout<<"Enter marks obtained in Physic:";
cin>>physics;
cout<<"Enter marks obtained in Computer:";
cin>>Computer;
}
void AcademicMarks::displayAca()
{
cout<<"Math:"<<math<<endl<<"Physic:"<<physics<<endl<<"Computer:"<<Computer<<endl;
}
class ExtraActivities:virtual public Student
{
protected: int emarks;
public: void inputExt();
void displayExt();
};
void ExtraActivities::inputExt()
{
cout<<"Entr emarks:";
cin>>emarks;
}
void ExtraActivities::displayExt()
{
cout<<"ExtraActivities Marks:"<<emarks<<endl;
}
class Result: public AcademicMarks,public ExtraActivities
{
int total;
public: void calculate();
};
void Result::calculate()
{
total=math+physics+Computer+emarks;
cout<<"Total marks :"<<total;
}
void main()
{
Result r;
r.inputS();
r.inputAca();
r.inputExt();
cout<<endl;
r.displayS();
r.displayAca();
r.displayExt();
cout<<endl;
r.calculate();
getch();
}
Here we used virtual becuase we have the data members and member functions
of class Student inherited to class AcademicMarks and class ExtraActivities as
it is (Hierarchical Inheritance) but as we look in above question,we have again
class Result that is derived from class AcademicMarks and class ExtraActivities
ie(Multiple Inheritance).So,here at first we have class Student data inherited
to class AcademicMarks and class ExtraActivities and again in class Result we
will obtain the multiple copies of data of class Student that are inherited
to that class AcademicMarks and class ExtraActivities,this results ambiguity error
as we have tried to acces data member of class Student from class Result as we have
multiple copies of class Student data member
When we use virtual base class,we first identify ancestor class (class Student)where
multiple copies are inherited in common child ckasses.Then we declare virtual base class when
immediate children classes are derived,virtual base class restircts its common child
class to have multiple copies of ancestor class.In this case,class Result inherits
only one copy of ckass members which are shared by Academic class and ExtraActivities
class.So class Student is virtual base class of class Result.
Using Constructor
#include<iostream.h>
#include<conio.h>
#include<string.h>
class Student
{
protected: char name[20];
int roll;
public: Student()
{
}
Student(char n[],int r)
{
strcpy(name,n);
roll=r;
}
void displayS();
};
void Student::displayS()
{
cout<<"Name:"<<name<<endl<<"Roll no:"<<roll<<endl;
}
class AcademicMarks:virtual public Student
{
protected: int math;
int physics;
int Computer;
public :
AcademicMarks()
{
}
AcademicMarks(char n[],int r,int ma,int ph,int co):Student(n,r)
{
math=ma;
physics=ph;
Computer=co;
}
void displayAca();
};
void AcademicMarks::displayAca()
{
cout<<"Math:"<<math<<endl<<"Physic:"<<physics<<endl<<"Computer:"<<Computer<<endl;
}
class ExtraActivities:virtual public Student
{
protected: int emarks;
public: ExtraActivities()
{
}
ExtraActivities(char n[],int r,int em):Student(n,r)
{
emarks=em;
}
void displayExt();
};
void ExtraActivities::displayExt()
{
cout<<"ExtraActivities Marks:"<<emarks<<endl;
}
class Result: public AcademicMarks,public ExtraActivities
{
int total;
public: Result()
{
}
Result(char n[],int r,int ma,int ph,int co,int em,int t):AcademicMarks(n,r,ma,ph,co),ExtraActivities(n,r,em),Student(n,r)
{
total=t;
total=ma+ph+co+em+t;
}
void calculate();
};
void Result::calculate()
{
cout<<"Total marks :"<<total;
}
void main()
{
Result r("Bibek",20,30,40,60,10,0);
r.displayS();
r.displayAca();
r.displayExt();
r.calculate();
getch();
}

Comments
Post a Comment