Unit III
Unit III
When a class inherits from a single base class, it is known as single inheritance. Following program Ravinder
shows the single inheritance using public derivation. Your age please
#include<iostream.h> 27
#include<conio.h> number of workers under you
class worker
{ 30
clrscr ( ) ;
worker wl ;
manager ml;
Then the output will be as follows:
ml.get ( ) ;
My name is : Ravinder ml.show ( );
}
My age is : 27
The following program shows the single inheritance using protected derivation
No. of workers under me are : 30
#include<conio.h>
The following program shows the single inheritance by private derivation. #include<iostream.h>
classworker //Base class declaration
#include<iostream.h>
{ protected:
#include<conio.h> int age; char name [20];
public:
classworker //Base classdeclaration
void get ( );
{ void show ( );
int age; };
char name [10] ; void worker :: get ()
public: {
void get ( ) ; cout >> “your name please”;
void show ( ) ; cin >>name;
}; cout << “your age please”;
void worker : : get ( ) cin >> age;
{ }
cout << “your name please” ; void worker :: show ( )
cin >> name; {
cout << “your age please”; cout << “in my name is: “ << name << “in my age is “ <<age;
cin >>age; }
} class manager:: protected worker // protected inheritance
void worker : show ( ) {
{ int now;
cout << “in my name is: “ <<name<< “in” << “my age is : “ <<age; public:
} void get ();
class manager : worker //Derived class (privately by default) void show ( ) ;
{ };
int now; void manager : : get ( )
public: {
void get ( ) ; cout << “please enter the name In”;
void show ( ) ; cin >> name;
}; cout<< “please enter the age In”; //Directly inputting thedata
void manager : : get ( ) cin>>age; members of baseclass
{ cout << “ please enter the no. of workers under you:”;
worker : : get ( ); //calling the get function of base cin >> now;
cout << “number of worker under you”; class which is }
cin >> now; void manager : : show ( )
}
void manager : : show ( ) {
{ cout « "your name is : "«name«" and age is : "«age;
worker : : show ( ) ; cout «"In no. of workers under your are : "«now;
cout << “in no. of worker under me are : “ <<now; main ( )
} {
main ( ) clrscr ( ) ;
{ manager ml;
ml.get ( ) ;
cout « "\n \n";
ml.show ( );
} Multilevel Inheritance
When the inheritance is such that, the class A serves as a base class for a derived class B which in
Making a Private Member Inheritable turn serves as a base class for the derived class C. This type of inheritance is called „MULTILEVEL
INHERITENCE‟. The class B is known as the „INTERMEDIATE BASE CLASS‟ since it provides a
Basically we have visibility modes to specify that in which mode you are deriving the another class link for the inheritance between A and C. The chain ABC is called „ITNHERITENCE*PATH‟ for
from the already existing base class. They are: e.g.
c. A member function of a derived class. This declaration will form the different levels of inheritance.
#include<iostream.h>
#include<conio.h>
classworker // Base classdeclaration
{
int age;
char name [20] ;
public;
void get( ) ;
void show( ) ;
}
main ( )
{
void worker: get ( ) clrscr ( ) ;
{ ceo cl ;
cout << “your name please” ; cl.get ( ) ; cout << “\n\n”;
cin >> name; cl.show ( ) ;
cout << “your age please” ; }
} Worker
void worker : : show ( )
{ Private:
cout << “In my name is : “ <<name<< “ In my age is : “ <<age; int age;
} char name[20];
class manager : public worker //Intermediate base class derived
{ //publicly from the base class Protected:
intnow;
public: Private:
void get ( ) ; int age;
void show( ) ; char name[20];
};
void manager :: get ( ) Manager:Worker
{
worker : :get (); //calling get ( ) fn. of base class Private:
cout << “no. of workers under you:”; int now;
cin >> now;
} Protected:
void manager : : show ( )
{ Public:
worker : : show (); //calling show ( ) fn. of base class void get()
cout << “In no. of workers under me are: “<<now; void show()
} worker::get()
class ceo:publicmanager //declaration of derivedclass worker::get()
{ //publicly inherited fromthe
intnom; //intermediate baseclass
public: Ceo: Manager
void get ( ) ;
void show ( ) ; Public:
};
void ceo : : get ( ) Protected:
{
manager : : get ( ) ; Public:
cout << “no. of managers under you are:”; cin >> nom; All the inherited
} members
Hierarchical Inheritance
Diagrammatic Representation of Multiple Inheritance is asfollows: Another interesting application of inheritance is to use is as a support to a hierarchical design of a
class program. Many programming problems can be cast into a hierarchy where certain features of
Father Mother one level are shared by many others below that level for e.g.
Protected: Protected:
Public: Public:
void get() void get()
Fixed deposit
void show() void show()
Short term Long term
Mid term
}
};
Virtual Base Classes
class result : public test, public sports //Derived from test
&sports We have just discussed a situation which would require the use of both multiple and multi level
{ inheritance. Consider a situation, where all the three kinds of inheritance, namely multi-level,
int total; multiple and hierarchical are involved.
public:
void display (void); Let us say the 'child' has two direct base classes „parent1‟ and „parent2‟ which themselves has a
}; common base class „grandparent‟. The child inherits the traits of „grandparent‟ via two separate
paths. It can also be inherit directly as shown by the broken line. The grandparent is sometimes
referred to as „INDIRECT BASE CLASS‟. Now, the inheritance by the child might cause some
void result : : display (void) problems. All the public and protected members of „grandparent‟ are inherited into „child‟ twice, first
{ via „parent1‟ and again via „parent2‟. So, there occurs a duplicacy which should beavoided.
total = part1 + part2 + score;
put_n ( ) ;. The duplication of the inherited members can be avoided by making common base class as the
put_m ( ); virtual base class: fore.g.
put_S ( ); classg_parent
cout << “Total score: “ <<total<< “\n” {
} //Body
main ( ) };
{ class parent1: virtual public g_parent
clrscr ( ) ; {
result S1; // Body
S1.get_n (347) ; };
S1.get_m (30, 35);
S1.get_s (7) ; class parent2: public virtual g_parent
S1.dciplay ( ) ; {
}
// Body
};
class child : public parent1, public parent2
{
// body
};
When a class is virtual base class, C++ takes necessary care to see that only one copy
of that class is inherited, regardless of how many inheritance paths exists between
virtual base class and derived class. Note that keywords „virtual‟ and „public‟ can be
used in eitherorder.
#include<iostream.h>
#include<conio.h>
class employee {
int code
char name [20] ;
public:
virtual void getdata ( ) ;
virtual void display ( ) ;
};
class grade: public employee
{
char grd [90] ;
float salary ;
public :
void getdata ( ) ;
void display ( );
};
void employee :: getdata ( )
{
}
void employee:: display ( )
{
}
void grade : : getdata ( )
{
cout<< “ enter employee‟s grade “;
cin>> grd ;
cout<< “\n enter the salary “ ;
cin>> salary;
}
void grade : : display ( )
{
cout«" Grade salary \n";
cout« grd« " "« salary« endl;
} // Global method, Base class object is passed by value void
void main ( ) somefunc (Baseobj)
{ {
employee *ptr ; obj.display();
grade obj ; }
ptr = &obj ;
ptr->getdata ( ) ; intmain()
ptr->display ( ) ; {
Base b(33); Derived
getche ( ) ;
d(45, 54);
}
Output somefunc(b);
enter employee‟s grade A somefunc(d); // Object Slicing, the member j of d is sliced off return0;
enter the salary 250000 }
Grade salary
A 250000 Output:
I am Base class object, i = 33 I am
Base class object, i = 45
Object Slicing:
We can avoid above unexpected behavior with the use of pointers or references. Object slicing
In C++, a derived class object can be assigned to a base class object, but the other way is not doesn‟t occur when pointers or references to objects are passed as function arguments since apointer
possible. or reference of any type takes same amount of memory. For example, if we change the global
method myfunc() in the above program to following, object slicing doesn‟thappen.
classBase { intx, y; };
// rest of code is similar to above void
classDerived : publicBase { intz, w; }; intmain() somefunc (Base&obj)
{ {
Derived d; obj.display();
Base b = d; //ObjectSlicing, z and w of d are slicedoff }
} // rest of code is similar to above
Object Slicing happens when a derived class object is assigned to a base class object, additional Output:
attributes of a derived class object are sliced off to form the base class object.
I am Base class object, i = 33
I am Derived class object, i = 45, j = 54
#include
<iostream>usingnamespac
We get the same output if we use pointers and change the program to following.
estd;
// rest of code is similar to above void
classBase
{ somefunc (Base*objp)
protected: {
inti; objp->display();
}
public: intmain()
Base(inta) { i = a; } {
virtualvoiddisplay() Base *bp = new Base(33);
{ cout << "I am Base class object, i = " << i << endl;} Derived *dp = new Derived(45,54); somefunc(bp);
}; somefunc(dp); // No Object Slicing
return0;
classDerived : publicBase }
{
intj;
public: Output:
Derived(inta, intb) : Base(a) { j = b; }
virtualvoiddisplay() I am Base class object, i = 33
{ cout << "I am Derived class object, i = " I am Derived class object, i = 45, j = 54
<< i << ", j = " << j<<endl; }
}; Object slicing can be prevented by making the base class function pure virtual there by disallowing
object creation. It is not possible to create the object of a class which contains a pure virtual method.
If base class and derived class have member functions with same name and arguments. If you create
an object of derived class and write code to access that member function then, the member function
in derived class is only invoked, i.e., the member function of derived class overrides the member
function of base class. This feature in C++ programming is known as function overriding.
Abstract Class
Abstract Class is a class which contains atleast one Pure Virtual function in it. Abstract classes are
used to provide an Interface for its sub classes. Classes inheriting an Abstract Class must provide
definition to the pure virtual function, otherwise they will also become abstract class.
1. Abstract class cannot be instantiated, but pointers and refrences of Abstract class type can be
Accessing the Overridden Function in Base Class From Derived Class created.
2. Abstract class can have normal functions and variables along with a pure virtualfunction.
To access the overridden function of base class from derived class, scope resolution operator ::. For 3. Abstract classes are mainly used for Upcasting, so that its derived classes can useits
example: If you want to access get_data() function of base class from derived class in above interface.
example then, the following statement is used in derived class. 4. Classes inheriting an Abstract Class must implement all pure virtual functions, or else they
will become Abstracttoo.
A::get_data; // Calling get_data() of class A.
Pure Virtual Functions
It is because, if the name of class is not specified, the compiler thinks get_data() function is calling
Pure virtual Functions are virtual functions with no definition. They start with virtual keyword and
itself.
ends with = 0. Here is the syntax for a pure virtual function,
int main()
{
Baseobj; //Compile TimeError
Base *b;
Derived d;
b = &d;
b->show();
}
In the above example Base class is abstract, with pure virtual show() function, hence we cannot
create object of base class.
When we create a pure virtual function in Abstract class, we reserve a slot for a function in the
VTABLE(studied in last topic), but doesn't put any address in that slot. Hence the VTABLE will be
incomplete.
As the VTABLE for Abstract class is incomplete, hence the compiler will not let the creation of
object for such class and will display an errror message whenever you try to do so.
30 P.T.O