Virtual Inheritance

 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