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
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy