Implémenter des interfaces à l'aide d'une classe abstraite en C++

Migel Hewage Nimesha 12 octobre 2023
  1. Concept de classe abstraite en C++
  2. Implémenter une fonction virtuelle pure dans un programme à l’aide de C++
Implémenter des interfaces à l'aide d'une classe abstraite en C++

En Java, les héritages multiples sont réalisés à l’aide d’interface. interface est comme un modèle car il contient la mise en page nécessaire mais est abstrait ou n’a pas de corps de méthode.

En ce qui concerne C++, il n’y a pas besoin d’interfaces car C++ prend en charge plusieurs héritages, contrairement à Java. En C++, la fonctionnalité des interfaces peut être obtenue à l’aide d’une classe abstraite.

Concept de classe abstraite en C++

Une classe abstraite est une classe avec au moins une fonction virtuelle pure. Il n’est possible de déclarer qu’une fonction virtuelle pure, il ne peut y avoir de définition pour celle-ci, et elle est déclarée en affectant 0 dans la déclaration.

Les classes abstraites sont très utiles pour rendre un code réutilisable et extensible. En effet, il est possible de créer de nombreuses classes dérivées qui héritent de la classe parent mais avec leurs définitions uniques.

De plus, les classes abstraites ne peuvent pas être instanciées.

Exemple:

class A {
 public:
  virtual void b() = 0;  // function "b" in class "A" is an example of a pure
                         // virtual function
};

Lors de la déclaration de la fonction, essayer de rendre la fonction purement virtuelle tout en la définissant ne fonctionnerait pas.

Implémenter une fonction virtuelle pure dans un programme à l’aide de C++

Prenons un exemple avec shape comme classe parent. En ce qui concerne les formes, il en existe de nombreux types différents, et lorsque nous devons calculer des propriétés, par exemple, la surface, la façon dont nous la calculons diffère d’une forme à l’autre.

Un rectangle et un triangle comme classes dérivées héritant de la classe mère de shape. Ensuite, nous fournirons à la fonction virtuelle pure la définition nécessaire pour chaque forme (rectangle et triangle) dans leur propre classe dérivée.

Code source:

#include <iostream>

using namespace std;
class Shape {
 protected:
  int length;
  int height;

 public:
  virtual int Area() = 0;

  void getLength() { cin >> length; }

  void getHeight() { cin >> height; }
};

class Rectangle : public Shape {
 public:
  int Area() { return (length * height); }
};

class Triangle : public Shape {
 public:
  int Area() { return (length * height) / 2; }
};

int main() {
  Rectangle rectangle;
  Triangle triangle;

  cout << "Enter the length of the rectangle: ";
  rectangle.getLength();
  cout << "Enter the height of the rectangle: ";
  rectangle.getHeight();
  cout << "Area of the rectangle: " << rectangle.Area() << endl;

  cout << "Enter the length of the triangle: ";
  triangle.getLength();
  cout << "Enter the height of the triangle: ";
  triangle.getHeight();
  cout << "Area of the triangle: " << triangle.Area() << endl;

  return 0;
}

Production:

Enter the length of the rectangle: 2
Enter the height of the rectangle: 4
Area of the rectangle: 8
Enter the length of the triangle: 4
Enter the height of the triangle: 6
Area of the triangle: 12
Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.