Classes abstraites et C ++

C ++ supports liaison tardive, qui est quand il résout un appel de méthode en fonction du type d'exécution (ou de type dynamique) de l'objet cible plutôt que son type déclaré (ou type statique). Ceci est démontré dans le code C ++ extrait suivant:

#comprendre using namespace std classe Four {public: cuisinier virtual void () {cout lt; lt; "Cuisiner avec un four" lt; lt; endl -}} - Fourneau de classe: Four publique {public: cuisinier virtual void () {cout lt; lt; "Cuisiner avec un four à micro-ondes" lt; lt; endl -}} - prepareMeal void (Four four) {oven.cook () -}

Dans la fonction prepareMeal (), l'appel à oven.cook () peut passer à Four :: cuire () ou Fourneau :: cuire () selon le moment de l'exécution (la "réelle") Type de la four objet est passé.

La virtuel mot-clé ici est critique. Sans elle, le Cook () méthode serait liée début, basé sur le type de compilation, et invoquer Four :: cuire () chaque fois. Une fois déclarée virtuelle dans le Four la classe, la méthode est supposé être virtuelle dans chaque sous-classe, mais il ne fait pas mal à répéter la déclaration afin que les lecteurs comprennent.

Le programme simple suivant illustre ce principe en pratique:

int main () {Four four prepareMeal (four) -MicrowaveOven mo-prepareMeal (mo) -Retour 0-}

Dans ce programme, l'appel à Cook () génère deux sorties différentes en fonction du type de four:




Cuisiner avec un ovenCooking avec un four micro-ondes

Il est pas toujours le cas, un procédé que dans la classe de base peut être défini. Prendre en compte Four cas plus attentivement. Il ya un certain nombre de différents types de fours - les fours conventionnels, fours à convection, et les fours à micro - mais on pourrait faire valoir qu'il n'y a aucune réelle du four qui ne fait pas partie de l'un de ces sous-classes. Vous pourriez être en mesure de dire comment les différents types de fours effectuent la cuisinier opération - qui est, ce qui a ConventionalOven :: cuire () et un Fourneau :: cuire () devrait faire peut être défini. Il est sans doute pas possible de définir les actions Four :: cuire () doit effectuer.

Vous ne pouvez pas simplement laisser Four :: cuire () non déclarées dans un langage fortement typé comme C ++. Cependant, vous pouvez déclarer une méthode mais laissez-le inappliquées si aucune application existe. On utilise la syntaxe suivante curieux de le faire:

Four classe {public: virtual cuisinier void () = 0 -} -

Ce code déclare une méthode Four::Cook () qui est lié en retard, mais ne met pas la méthode. En fait, il va plus loin en disant que la méthode ne sera pas mis en œuvre. En C ++, un tel procédé est dit être virtuelle pure. Les programmeurs C utilisent également de l'expression préféré dans de nombreux autres langages informatiques fortement typées: abstrait. La Four classe est dite abstraite.

Un résumé représente une propriété que vous savez la classe possède mais ne savez pas comment mettre en œuvre sans ambiguïté dans la classe courante.

Une classe est abstraite si elle contient un ou plusieurs des méthodes virtuelles pures. La signification de ceci est que vous ne pouvez pas instancier une classe abstraite. Ainsi, le suivant est plus permis:

int main () {Four four prepareMeal (four) -Retour 0-}

La raison en est très simple: si vous avez créé un objet de classe Four et ensuite essayé d'invoquer oven.cook (), ce qui devrait le compilateur faire?

À un niveau plus philosophique, il est bien de dire qu'il y est un terme commun appelé Four qui décrit les fours conventionnels et les fours à micro-ondes et fours à convection. Ce terme Four est un concept d'habitude car il lie les similitudes dans l'ensemble de ces sous-classes. Mais il n'y a pas d'exemple d'un four qui est pas l'un des sous-classes de Four.

Une sous-classe d'une classe abstraite est elle-même abstraite jusqu'à ce que toutes les méthodes virtuelles pures ont été substituée par des non-abstraite (qui est, béton) Versions. Ainsi la classe Four micro-onde dans le code précédent est pas abstraite - même si Four étaient abstraite - parce qu'il remplace Cook () avec sa propre version concrète.

Remarquez qu'il n'y a rien de mal avec la fonction prepareMeal () définis comme suit:

annuler prepareMeal (Four four) {oven.cook () -}

Même si l'argument est déclaré être un Four, elle ne peut être invoquée avec un certain sous-classe de Four, comme Four micro-onde ou ConventionalOven, Pour qui Cook () est défini.


» » » » Classes abstraites et C ++