52 votes

Quelle est la différence entre une classe concrète et une classe abstraite?

J'apprends le C ++, mais je suis confus à propos des cours abstraits et des cours concrets. Quelques exemples du monde réel seraient appréciés.

98voto

wich Points 7276

Une classe abstraite est une classe pour laquelle une ou plusieurs méthodes sont déclarées mais non défini, ce qui signifie que le compilateur sait que ces méthodes font partie de la classe, mais pas ce code à exécuter pour cette méthode. Celles-ci sont appelées des méthodes abstraites. Voici un exemple d'une classe abstraite.

class shape {
public:
  virtual void draw() = 0;
};

Il déclare une classe abstraite qui spécifie que tous les descendants de la classe doit implémenter la méthode de tirage si la classe est d'être concret. Vous ne peut pas instancier cette classe parce qu'elle est abstraite, après tout, le compilateur ne sais pas ce code à exécuter si vous l'avez appelé membre de tirage. Si vous ne pouvez pas effectuer les opérations suivantes:

shape my_shape();
my_shape.draw();

Pour être en mesure d'utiliser la méthode de tirage, vous devrez constituer des classes de cette classe abstraite, qui n'mettre en œuvre la méthode de tirage, rendant les classes concrètes:

class circle : public shape {
public:
  circle(int x, int y, int radius) {
    /* set up the circle */
  }
  virtual draw() {
    /* do stuff to draw the circle */
  }
};

class rectangle : public shape {
public:
  rectangle(int min_x, int min_y, int max_x, int max_y) {
    /* set up rectangle */
  }
  virtual draw() {
    /* do stuff to draw the rectangle */
  }
};

Maintenant, vous pouvez instancier les objets concrets le cercle et le rectangle et d'utiliser leurs méthodes draw:

circle my_circle(40, 30, 10);
rectangle my_rectangle(20, 10, 50, 15);
my_circle.draw();
my_rectangle.draw();

Maintenant, bien sûr, la question est, pourquoi voudriez-vous faire cela? Ne pourriez-vous aussi bien avoir défini le cercle et le rectangle classes et les ont fait disparaître toute forme de classe? Vous pourriez, mais alors vous ne serait pas en mesure de prendre avantage de leur héritage:

std::vector<shape*> my_scene;
my_scene.push_back(new circle(40, 30, 10));
my_scene.push_back(new rectangle(20, 10, 50, 15));
std::for_each(my_scene.begin(), my_scene.end(), std::mem_fun_ref(&shape::draw)

Ce code vous permet de rassembler toutes vos formes dans un récipient. Cela le rend beaucoup plus facile si vous avez beaucoup de formes et de différentes formes dans votre scène. Par exemple, nous pouvons maintenant tirer toutes les formes d'un seul coup, et le code qui le fait n'a même pas besoin de connaître les différents types de formes que nous avons.

Maintenant, enfin, nous avons besoin de savoir pourquoi le tirage au sort de la fonction de forme est abstraite, et non pas seulement une fonction vide, c'est à dire pourquoi ne pas nous venons de définir:

class shape {
public:
  virtual void draw() {
    /* do nothing */
  }
};

La raison pour cela est que nous ne voulons pas vraiment les objets de forme de type, ils ne seraient pas des vraies choses de toute façon, ils seraient abstraites. Donc, il ne fait aucun sens pour définir une mise en œuvre de la méthode de dessin, même vide. Pour obtenir la forme de la classe abstraite nous empêche de nous, à tort, l'instanciation de la classe de forme, ou à tort d'appeler le vide dessiner fonction de la classe de base au lieu de la fonction draw des classes dérivées. En effet, nous définissons une interface pour toute la classe qui voudrais se comporter comme une forme, nous disons qu'une telle classe doit avoir une méthode de dessin qui ressemble comme nous l'avons spécifié, il doit.

Pour répondre à votre dernière question, il n'y a pas une telle chose comme un " normal dérivée de la classe de chaque classe est soit abstraite ou concrète. Une classe qui a des méthodes abstraites est abstraite, toute classe qui n'est pas en béton. C'est juste un moyen de différencier les deux types de classes. Une classe de base peut être abstrait ou concret et une classe dérivée peut être abstrait ou concret:

class abstract_base {
public:
  virtual void abstract_method1() = 0;
  virtual void abstract_method2() = 0;
};

class concrete_base {
public:
  void concrete_method1() {
    /* do something */
  }
};

class abstract_derived1 : public abstract_base {
public:
  virtual void abstract_method3() = 0;
};

class abstract_derived2 : public concrete_base {
public:
  virtual void abstract_method3() = 0;
};

class abstract_derived3 : public abstract_base {
public:
  virtual abstract_method1() {
    /* do something */
  }
  /* note that we do not provide an implementation for
     abstract_method2 so the class is still abstract */
};

class concrete_derived1 : public concrete_base {
public:
  void concrete_method2() {
    /* do something */
  }
};

class concrete_derived2 : public abstract_base {
public:
  virtual void abstract_method1() {
    /* do something */
  }
  virtual void abstract_method2() {
    /* do something */
  }
  /* This class is now concrete because no abstract methods remain */
};

23voto

Th. Manjit SEMC Points 71

Classe abstraite ne peut pas être utilisé pour créer un objet. Alors que, de la classe de béton peut être utilisé pour créer un objet.

Béton signifie"existant dans la réalité ou dans la vraie expérience; perceptible par les sens; le réel". Alors que, abstrait signifie"pas appliquée ou pratique; théorique'.

Un résumé de classe ne peut pas être instanciée. Alors que, d'un béton , on peut.

Un résumé s'agit d'une classe qui a un ou plusieurs fonction virtuelle pure. Alors qu'un béton de classe n'a pas de fonctions virtuelles pures.

20voto

Jansen Price Points 970

Un béton de classe est une classe qui peut être utilisé pour créer un objet. Une classe abstraite ne peut pas être utilisé pour créer un objet (vous devez étendre une classe abstraite et faire un béton de classe pour pouvoir ensuite créer un objet).

Prétendre qu'il y a une machine qui peut "timbre" de matières premières et de faire une voiture. Le tampon encreur est une classe concrète. De cela, nous pouvons créer des objets car. Une classe abstraite serait l'empreinte de la matrice. Vous ne pouvez pas rendre les voitures à partir de l'empreinte de la matrice, vous avez besoin de faire le stamper classe de première de la de bleus.

3voto

3voto

jldupont Points 31331

Une classe abstraite ne peut pas être instanciée alors qu'une classe concrète peut l'être. Une classe abstraite sert de "modèle" pour les classes dérivées, celles qui peuvent être instanciées.

Par exemple, Car classe (résumé) tandis que Audi S4 classe (dérivant de Car ) est une implémentation concrète.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X