Thanks to visit codestin.com
Credit goes to www.tutorialspoint.com

C++ - Pure Virtual Functions and Abstract Classes



Pure Virtual Functions and Abstract Classes

A pure virtual function is a virtual function in C++ for which we need not write any function definition and only have to declare it, where it is declared by assigning 0 in the declaration. To declare a virtual function, use the "virtual" keyword. 

Whereas, an abstract class is a class in C++ which have at least one pure virtual function.

Syntax

virtual return_type func_name(parameters) = 0;

Where

  • return_type is the return type of the function (e.g., int, void, etc.)
  • func_name is the name of the function.
  • parameters is the list of parameters the function.
  • = 0 syntax indicates that the function is pure virtual, which has no definition in the base class.

Example of Pure Virtual Function

class Shape {public:  // Pure virtual function
virtual void draw() = 0; };

Example of Abstract Class

An abstract class is a class that contains at least one pure virtual function.

class Shape {public: virtual void draw() = 0; // Pure virtual function makes Shape an abstract class
virtual ~Shape() {} // Virtual destructor (good practice)
};

Example of Pure Virtual Functions and Abstract Classes

Here is the full example showcasing the working of it.

#include<iostream>
using namespace std;

// Abstract class
class Shape {
  public: virtual void draw() = 0; // Pure virtual function
  virtual~Shape() {} // Virtual destructor
};

// Derived class: Circle
class Circle: public Shape {
  public: void draw() override {
    cout << "Drawing Circle" << endl;
  }
};

// Derived class: Rectangle
class Rectangle: public Shape {
  public: void draw() override {
    cout << "Drawing Rectangle" << endl;
  }
};

// Derived class: Triangle
class Triangle: public Shape {
  public: void draw() override {
    cout << "Drawing Triangle" << endl;
  }
};

int main() {
  Shape * shapes[] = {
    new Circle(),
    new Rectangle(),
    new Triangle()
  };

  // Draw all shapes
  for (Shape * shape: shapes) {
    shape -> draw();
  }

  // Cleanup
  for (Shape * shape: shapes) {
    delete shape;
  }

  return 0;
}

When the above code is compiled and executed, it produces the following result −

Drawing Circle
Drawing Rectangle
Drawing Triangle

Key Features of Abstract Classes

  • Abstract classes can have normal functions and variables too, along with a pure virtual function.
  • Abstract class cannot be instantiated, but pointers and references of Abstract class type can be created.
  • Abstract classes are mainly used for Upcasting so that their derived classes can use its interface.
  • If an Abstract Class has a derived class, it must implement all pure virtual functions, or else they will become Abstract too.
  • We cant create an object of abstract class as we reserve a slot for a pure virtual function in Vtable, but we dont put any address, so Vtable will remain incomplete.
Advertisements