Lecture-3 (Module 3)
Lecture-3 (Module 3)
class A
... .. ...
};
class B
... .. ...
};
};
#include<iostream>
class A
public:
};
class B
public:
};
class C: public B, public A // Note the order
public:
};
int main()
C c;
return 0;
}
Output:
B's constructor called
class Person {
public:
};
class Faculty : public Person {
public:
Faculty(int x):Person(x) {
};
class Student : public Person {
public:
Student(int x):Person(x) {
};
class TA : public Faculty, public Student {
public:
};
int main() {
TA ta1(30);
}
Person::Person(int ) called
Faculty::Faculty(int ) called
Person::Person(int ) called
Student::Student(int ) called
TA::TA(int ) called
In the above program, constructor of ‘Person’ is called two times. Destructor of ‘Person’ will also be called two
times when object ‘ta1’ is destructed. So object ‘ta1’ has two copies of all members of ‘Person’, this causes
ambiguities. The solution to this problem is ‘virtual’ keyword. We make the classes ‘Faculty’ and ‘Student’ as virtual
base classes to avoid two copies of ‘Person’ in ‘TA’ class.
For example, consider the following program.
#include<iostream>
class Person {
public:
};
public:
Faculty(int x):Person(x) {
}
class Student : virtual public Person {
public:
Student(int x):Person(x) {
};
public:
};
int main() {
TA ta1(30);
Output:
Person::Person() called
Faculty::Faculty(int ) called
Student::Student(int ) called
TA::TA(int ) called
In the above program, constructor of ‘Person’ is called once. One important thing to note in the above output is,
the default constructor of ‘Person’ is called. When we use ‘virtual’ keyword, the default constructor of grandparent
class is called by default even if the parent classes explicitly call parameterized constructor. How to call the
parameterized constructor of the ‘Person’ class? The constructor has to be called in ‘TA’ class. For example,
see the following program.
#include<iostream>
class Person {
public:
};
public:
Faculty(int x):Person(x) {
};
class Student : virtual public Person {
public:
Student(int x):Person(x) {
};
public:
};
int main() {
TA ta1(30);
}
Output:
Person::Person(int ) called
Faculty::Faculty(int ) called
Student::Student(int ) called
TA::TA(int ) called
Virtual base class in C++
Virtual base classes are used in virtual inheritance in a way of preventing multiple “instances” of a given class
appearing in an inheritance hierarchy when using multiple inheritances.
Need for Virtual Base Classes:
Consider the situation where we have one class A .This class is A is inherited by two other classes B and C. Both
these class are inherited into another in a new class D as shown in figure below.
As we can see from the figure that data members/function of class A are inherited twice to class D. One through
class B and second through class C. When any data / function member of class A is accessed by an object of
class D, ambiguity arises as to which data/function member would be called? One inherited through B or the other
inherited through C. This confuses compiler and it displays error.
#include <iostream>
class A {
public:
void show()
};
class B : public A {
};
class C : public A {
};
};
int main()
D object;
object.show();
}
Compile Errors:
prog.cpp: In function 'int main()':
object.show();
void show()
To resolve this ambiguity when class A is inherited in both class B and class C, it is declared as virtual base
class by placing a keyword virtual as :
Syntax for Virtual Base Classes:
Syntax 1:
};
Syntax 2:
};
Note: virtual can be written before or after the public. Now only one copy of data/function member will be copied
to class C and class B and class A becomes the virtual base class.
Virtual base classes offer a way to save space and avoid ambiguities in class hierarchies that use multiple
inheritances. When a base class is specified as a virtual base, it can act as an indirect base more than once
without duplication of its data members. A single copy of its data members is shared by all the base classes that
use virtual base.
#include <iostream>
class A {
public:
int a;
A() // constructor
a = 10;
};
class B : public virtual A {
};
};
};
int main()
return 0;
}
Output:
a = 10
Explanation :The class A has just one data member a which is public. This class is virtually inherited in class B
and class C. Now class B and class C becomes virtual base class and no duplication of data member a is done.
#include <iostream>
class A {
public:
void show()
};
class B : public virtual A {
};
};
};
int main()
D object;
object.show();
}
Output:
Hello from A