B.C.A Study: Inheritance
B.C.A Study: Inheritance
A study
Inheritance
In C++, it is possible to inherit attributes and methods from one class to another. We group the “inheritance
concept” into two categories:
derived class (child) – the class that inherits from another class
base class (parent) – the class being inherited from
Implementing inheritance in C++: For creating a sub-class which is inherited from the base class we
have to follow the below syntax.
Syntax:
Here, subclass_name is the name of the sub class, access_mode is the mode in which you want to inherit
this sub class for example: public, private etc. and base_class_name is the name of the base class from
which you want to inherit the sub class.
Note: A derived class doesn’t inherit access to private data members. However, it does inherit a full parent
object, which contains any private members which that class declares.
class derivation list names one or more base classes and has the form −
Where access-specifier is one of public, protected, or private, and base-class is the name of a previously
defined class. If the access-specifier is not used, then it is private by default.
Consider a base class Shape and its derived class Rectangle as follows −
#include <iostream>
// Base class
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// Derived class
class Rectangle: public Shape {
public:
int getArea() {
return (width * height);
}
};
int main(void) {
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
When the above code is compiled and executed, it produces the following result −
Total area: 35
Access Control and Inheritance
A derived class can access all the non-private members of its base class. Thus base-class members that
should not be accessible to the member functions of derived classes should be declared private in the base
class.
We can summarize the different access types according to – who can access them in the following way −
A derived class inherits all base class methods with the following exceptions −
We hardly use protected or privateinheritance, but public inheritance is commonly used. While using
different type of inheritance, following rules are applied −
Public Inheritance − When deriving a class from a public base class, publicmembers of the base
class become public members of the derived class and protected members of the base class
become protected members of the derived class. A base class’s private members are never accessible
directly from a derived class, but can be accessed through calls to the public and protectedmembers
of the base class.
Protected Inheritance − When deriving from a protected base
class, public and protected members of the base class become protectedmembers of the derived
class.
Private Inheritance − When deriving from a private base class, public and protected members of
the base class become private members of the derived class.
1) Single inheritance
2) Multilevel inheritance
3) Multiple inheritance
4) Hierarchical inheritance
5) Hybrid inheritance
Single inheritance
B inherits A
Output:
Constructor of A class
Constructor of B class
2)Multilevel Inheritance
Output:
Constructor of A class
Constructor of B class
Constructor of C class
Multiple Inheritance
In multiple inheritance, a class can inherit more than one class. This means that in this type of inheritance a
single child class can have multiple parent classes.
For example:
Constructor of A class
Constructor of B class
Constructor of C class
4)Hierarchical Inheritance
In this type of inheritance, one parent class has more than one child class. For example:
Output:
Constructor of A class
Constructor of C class
5) Hybrid Inheritance
Hybrid inheritance is a combination of more than one type of inheritance. For example, A child and parent
class relationship that follows multiple and hierarchical inheritance both can be called hybrid inheritance.
Polymorphism in C++
Polymorphism is a feature of OOPSthat allows the object to behave differently in different conditions. In
C++ we have two types of polymorphism:
1) Compile time Polymorphism – This is also known as static (or early) binding.
2) Runtime Polymorphism – This is also known as dynamic (or late) binding.
Function overloading and Operator overloading are perfect example of Compile time polymorphism.
In this example, we have two functions with same name but different number of arguments. Based on how
many parameters we pass during function call determines which function is to be called, this is why it is
considered as an example of polymorphism because in different conditions the output is different. Since,
the call is determined during compile time thats why it is called compile time polymorphism.
#include <iostream>
using namespace std;
class Add {
public:
int sum(int num1, int num2){
return num1+num2;
}
int sum(int num1, int num2, int num3){
return num1+num2+num3;
}
};
int main() {
Add obj;
//This will call the first function
cout<<"Output: "<<obj.sum(10, 20)<<endl;
//This will call the second function
cout<<"Output: "<<obj.sum(11, 22, 33);
return 0;
}
Output:
Output: 30
Output: 66
2) Runtime Polymorphism
In case of function overriding we have two definitions of the same function, one is parent class and one in
child class. The call to the function is determined at runtime to decide which definition of the function is to
be called, thats the reason it is called runtime polymorphism.
#include <iostream>
using namespace std;
class A {
public:
void disp(){
cout<<"Super Class Function"<<endl;
}
};
class B: public A{
public:
void disp(){
cout<<"Sub Class Function";
}
};
int main() {
//Parent class object
A obj;
obj.disp();
//Child class object
B obj2;
obj2.disp();
return 0;
}
Output:
Super Class Function
Sub Class Function
Function overloading is a C++ programming feature that allows us to have more than one function having
same name but different parameter list, when I say parameter list, it means the data type and sequence of
the parameters, for example the parameters list of a function myfuncn(int a, float b) is (int,
float) which is different from the function myfuncn(float a, int b) parameter list (float,
int). Function overloading is a compile time polymorphism
Now that we know what is parameter list lets see the rules of overloading: we can have following functions
in the same scope.
The easiest way to remember this rule is that the parameters should qualify any one or more of the
following conditions, they should have different type, number or sequence of parameters.
For example:
These two functions have different parameter type:
This is not allowed as the parameter list is same. Even though they have different return types, its not valid.
#include <iostream>
using namespace std;
class Addition {
public:
int sum(int num1,int num2) {
return num1+num2;
}
int sum(int num1,int num2, int num3) {
return num1+num2+num3;
}
};
int main(void) {
Addition obj;
cout<<obj.sum(20, 15)<<endl;
cout<<obj.sum(81, 100, 10);
return 0;
}
Output:
35
191
Advantages of Function overloading
The main advantage of function overloading is to the improve the code readability and allows code
reusability. In the example 1, we have seen how we were able to have more than one function for the
same task(addition) with different parameters, this allowed us to add two integer numbers as well as three
integer numbers, if we wanted we could have some more functions with same name and four or five
arguments.
Imagine if we didn’t have function overloading, we either have the limitation to add only two integers or
we had to write different name functions for the same task addition, this would reduce the code readability
and reusability.
Function overriding is a feature that allows us to have a same function in child class which is already
present in the parent class. A child class inherits the data members and member functions of parent class,
but when you want to override a functionality in the child class then you can use function overriding. It is
like creating a new version of an old function, in the child class.
To override a function you must have the same signature in child class. By signature I mean the data type
and sequence of parameters. Here we don’t have any parameter in the parent function so we didn’t use
any parameter in the child function.
#include <iostream>
using namespace std;
class BaseClass {
public:
void disp(){
cout<<"Function of Parent Class";
}
};
class DerivedClass: public BaseClass{
public:
void disp() {
cout<<"Function of Child Class";
}
};
int main() {
DerivedClass obj = DerivedClass();
obj.disp();
return 0;
}
Output:
Note: In function overriding, the function in parent class is called the overridden function and
function in child class is called overriding function.
Now that we understand what is function overloading and overriding in c++programming lets see the
difference between them:
1) Function Overloading happens in the same class when we declare same functions with different
arguments in the same class. Function Overriding is happens in the child class when child class overrides
parent class function.
2) In function overloading function signature should be different for all the overloaded functions. In
function overriding the signature of both the functions (overriding function and overridden function)
should be same.
3) Overloading happens at the compile time thats why it is also known as compile time polymorphism
while overriding happens at run time which is why it is known as run time polymorphism.
4) In function overloading we can have any number of overloaded functions. In function overriding we can
have only one overriding function in the child class.
Overloading in C++
If we create two or more member of the same class having the same name but different in number or type
of parameter,it is known as C++ overloading.
For example, we can overload an operator ‘+’ in a class like String so that we can concatenate two strings
by just using +.
Other example classes where arithmetic operators may be overloaded are Complex Number, Fractional
Number, Big Integer, etc.
A WordPress.com Website.