0% found this document useful (0 votes)
11 views9 pages

LECTURE 7 - Friendship and Inheritance

Uploaded by

lyleholst
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views9 pages

LECTURE 7 - Friendship and Inheritance

Uploaded by

lyleholst
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 9

1

Virtual Classes Notes

ACADEMIC PROGRAMME: BSCS COMPUTER SCIENCE


COURSE CODE AND TITLE: BSCS 205: INTRODUCTION TO OOP
LECTURER’S NAME: PHILIP BTTOK
LECTURER’S CONTACTS: Phone No.: 0723683409 Email: [email protected]

Friendship and Inheritance


Expected Learning Outcomes:
By the end of this lesson, you should be able to:
i. Access types for private members
ii. How to use members of another class through inheritance

Friend functions
In principle, private and protected members of a class cannot be accessed from outside the same class
in which they are declared. However, this rule does not affect friends.
Friends are functions or classes declared as such.
If we want to declare an external function as friend of a class, thus allowing this function to have
access to the private and protected members of this class, we do it by declaring a prototype of this
external function within the class, and preceding it with the keyword friend:

Page 1 of 9
2
Virtual Classes Notes

The duplicate function is a friend of CRectangle. From within that function we have been able to
access the members width and height of different objects of type CRectangle, which are private
members. Notice that neither in the declaration of duplicate() nor in its later use in main() have we
considered duplicate a member of class CRectangle. It isn't! It simply has access to its private and
protected members without being a member.
The friend functions can serve, for example, to conduct operations between two different classes.
Generally, the use of friend functions is out of an object-oriented programming methodology, so
whenever possible it is better to use members of the same class to perform operations with them. Such
as in the previous example, it would have been shorter to integrate duplicate() within the class
CRectangle.

Friend classes
Just as we have the possibility to define a friend function, we can also define a class as friend of
another one, granting that first class access to the protected and private members of the second one.

Page 2 of 9
3
Virtual Classes Notes

In this example, we have declared CRectangle as a friend of CSquare so that CRectangle member
functions could have access to the protected and private members of CSquare, more concretely to
CSquare::side, which describesmthe side width of the square.
You may also see something new at the beginning of the program: an empty declaration of class
CSquare. This is necessary because within the declaration of CRectangle we refer to CSquare (as a
parameter in convert()). The definition of CSquare is included later, so if we did not include a previous
empty declaration for CSquare this class would not be visible from within the definition of
CRectangle.
Consider that friendships are not corresponded if we do not explicitly specify so. In our example,
CRectangle is considered as a friend class by CSquare, but CRectangle does not consider CSquare to
be a friend, so CRectangle can access the protected and private members of CSquare but not the
reverse way. Of course, we could have declared also CSquare as friend of CRectangle if we wanted to.
Another property of friendships is that they are not transitive: The friend of a friend is not considered
to be a friend unless explicitly specified.

Page 3 of 9
4
Virtual Classes Notes

Inheritance between classes


A key feature of C++ classes is inheritance. Inheritance allows to create classes which are derived from
other classes, so that they automatically include some of its "parent's" members, plus its own. For
example, we are going to suppose that we want to declare a series of classes that describe polygons
like our CRectangle, or like CTriangle. They have certain common properties, such as both can be
described by means of only two sides: height and base.
This could be represented in the world of classes with a class CPolygon from which we would derive
the two other ones: CRectangle and CTriangle.

Page 4 of 9
5
Virtual Classes Notes

The class CPolygon would contain members that are common for both types of polygon. In our case:
width and height. And CRectangle and CTriangle would be its derived classes, with specific features
that are different from one type of polygon to the other.
Classes that are derived from others inherit all the accessible members of the base class. That means
that if a base class includes a member A and we derive it to another class with another member called
B, the derived class will contain both members A and B.
In order to derive a class from another, we use a colon (:) in the declaration of the derived class using
the following format:

Where derived_class_name is the name of the derived class and base_class_name is the name of the
class on which it is based. The public access specifier may be replaced by any one of the other access
specifiers protected and private. This access specifier describes the minimum access level for the
members that are inherited from the base class.

Page 5 of 9
6
Virtual Classes Notes

The objects of the classes CRectangle and CTriangle each contain members inherited from CPolygon.
These are: width, height and set_values().
The protected access specifier is similar to private. Its only difference occurs in fact with inheritance.
When a class inherits from another one, the members of the derived class can access the protected
members inherited from the base class, but not its private members.
Since we wanted width and height to be accessible from members of the derived classes CRectangle
and CTriangle and not only by members of CPolygon, we have used protected access instead of
private.
We can summarize the different access types according to who can access them in the following way:

Page 6 of 9
7
Virtual Classes Notes

Where "not members" represent any access from outside the class, such as from main(), from another
class or from a function.
In our example, the members inherited by CRectangle and CTriangle have the same access
permissions as they had in their base class CPolygon:

This is because we have used the public keyword to define the inheritance relationship on each of the
derived classes:

This public keyword after the colon (:) denotes the maximum access level for all the members
inherited from the class that follows it (in this case CPolygon). Since public is the most accessible
level, by specifying this keyword the derived class will inherit all the members with the same levels
they had in the base class.
If we specify a more restrictive access level like protected, all public members of the base class are
inherited as protected in the derived class. Whereas if we specify the most restricting of all access
levels: private, all the base class members are inherited as private.
For example, if daughter was a class derived from mother that we defined as:

This would set protected as the maximum access level for the members of daughter that it inherited
from mother. That is, all members that were public in mother would become protected in daughter. Of
course, this would not restrict daughter to declare its own public members.
That maximum access level is only set for the members inherited from mother.
If we do not explicitly specify any access level for the inheritance, the compiler assumes private for
classes declared with class keyword and public for those declared with struct.
What is inherited from the base class?
In principle, a derived class inherits every member of a base class except:
• its constructor and its destructor
• its operator=() members
Page 7 of 9
8
Virtual Classes Notes

• its friends
Although the constructors and destructors of the base class are not inherited themselves, its default
constructor (i.e., its constructor with no parameters) and its destructor are always called when a new
object of a derived class is created or destroyed.
If the base class has no default constructor or you want that an overloaded constructor is called when a
new derived object is created, you can specify it in each constructor definition of the derived class:

For example:

Notice the difference between which mother's constructor is called when a new daughter object is
created and which when it is a son object.
The difference is because the constructor declaration of daughter and son:

Page 8 of 9
9
Virtual Classes Notes

Further E-Resource Readings


CE, E. 3IT87: OBJECT ORIENTED PROGRAMMING WITH C++ CREDITS–4 (LTP: 3, 0, 2).

Page 9 of 9

You might also like