Last Updated : 19 May, 2025
A virtual function (also known as virtual methods) is a member function that is declared within a base class and is re-defined (overridden) by a derived class. When you refer to a derived class object using a pointer or a reference to the base class, you can call a virtual function for that object and execute the derived class's version of the method.
We can create a virtual function inside class using virtual keyword:
C++
class Base{
public:
virtual return_type
functionName(){
// Function body
}
}
class Derived : public Base{
public:
// Overriden virtual
// function of the base
// class
return_type functionName(){
// Function body
}
}
Example:
C++
#include <iostream>
using namespace std;
class Base {
public:
// Virtual function
virtual void display() {
cout << "Base class display" << endl;
}
};
class Derived : public Base {
public:
// Overriding the virtual
// function in the derived class
void display() {
cout << "Derived class display" << endl;
}
};
int main() {
Base* basePtr;
Derived derivedObj;
// Base class pointer pointing
// to derived class object
basePtr = &derivedObj;
// Calling the virtual function
basePtr->display();
return 0;
}
Derived class display
Pure Virtual FunctionNote: It is a recommended way to use override identifier to avoid mistakes while redefine virtual function inside the derived class.
A virtual function is called a pure virtual function if it does not have any implementation and is assigned = 0. A class that contains a pure virtual function is called an abstract class.
Example:
C++
#include <iostream>
using namespace std;
class Base {
public:
// Pure virtual function
virtual void display() = 0;
};
class Derived : public Base {
public:
void display() override {
cout << "Derived class display" << endl;
}
};
int main() {
Base* basePtr;
Derived derivedObj;
basePtr = &derivedObj;
basePtr->display();
return 0;
}
Derived class displayEarly Binding and Late Binding
In layman's terms, when a function is called in the code, binding decides which function gets executed based on the context such as the type of object or the function signature. Binding happens at two levels:
Example:
C++
#include <iostream>
using namespace std;
class base {
public:
virtual void print() {
cout << "print base "
"class\n";
}
void show() {
cout << "show base class\n";
}
};
class derived : public base {
public:
void print() {
cout << "print derived class\n";
}
void show() {
cout << "show derived class\n";
}
};
int main() {
base* bptr;
derived d;
bptr = &d;
// Virtual function,
// binded at runtime
bptr->print();
// Non-virtual function,
// binded at compile time
bptr->show();
return 0;
}
print derived class show base class
Explanation: In the above code, the print() function is declared with the virtual keyword so it will be bound at runtime and show() is non-virtual so it will be bound during compile time.
Working of Virtual Functions (concept of VTABLE and VPTR)Note: If we have created a virtual function in the base class and it is being overridden in the derived class then we don’t need a virtual keyword in the derived class, functions are automatically considered virtual functions in the derived class.
As discussed here, if a class contains a virtual function then the compiler itself does two things.
Consider the example below:
C++
#include <iostream>
using namespace std;
class base {
public:
void fun_1() { cout << "base-1\n"; }
virtual void fun_2() { cout << "base-2\n"; }
virtual void fun_3() { cout << "base-3\n"; }
virtual void fun_4() { cout << "base-4\n"; }
};
class derived : public base {
public:
void fun_1() { cout << "derived-1\n"; }
void fun_2() { cout << "derived-2\n"; }
void fun_4(int x) { cout << "derived-4\n"; }
};
int main() {
base* p;
derived obj1;
p = &obj1;
// Early binding because fun1() is non-virtual
// in base
p->fun_1();
// Late binding (RTP)
p->fun_2();
// Late binding (RTP)
p->fun_3();
// Late binding (RTP)
p->fun_4();
// Early binding but this function call is
// illegal (produces error) because pointer
// is of base type and function is of
// derived class
// p->fun_4(5);
return 0;
}
base-1 derived-2 base-3 base-4
Explanation: Initially, we create a pointer of the type base class and initialize it with the address of the derived class object. When we create an object of the derived class, the compiler creates a pointer as a data member of the class containing the address of VTABLE of the derived class.
A similar concept of Late and Early Binding is used as in the above example. For the fun_1() function call, the base class version of the function is called, fun_2() is overridden in the derived class so the derived class version is called, fun_3() is not overridden in the derived class and is a virtual function so the base class version is called, similarly fun_4() is not overridden so base class version is called.
Rules for Virtual FunctionsNote: fun_4(int) in the derived class is different from the virtual function fun_4() in the base class as prototypes of both functions are different.
The rules for the virtual functions in C++ are as follows:
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4