Classe abstraite

Fermé
DRSBMM - 28 déc. 2008 à 16:47
 DRSBMM - 29 déc. 2008 à 01:38
Bonjour,
je veux une definition de classe abstraite en C++,et un exemple si vous pouvez.
et merci d'avance.

1 réponse

Une classe abstraite est une classe qui ne peut être instanciée (c'est-à-dire qu'on ne pourra pas créer d'objet de ce type).
Alors pourquoi créer une classe abstraite?
Simplement pour servir de modèle à d'autres classes, car si elle ne peut être instanciée, elle peut (et même elle doit) être dérivée.
Pour qu'une classe soit abstraite, il suffit simplement qu'elle contienne au moins une fonction virtuelle, c'est à dire une fonction déclarée mais non définie mais qui devra nécessairement être définie dans les classes filles.
0
set_ce_qu'il faut définir un destructeur ?
0
je veux dire:
est-ce-qu'il faut définir un destructeur ?
et pour le constructeur et les autres fonctions membres faut-il les définir aussi ?
0
loupius > DRSBMM
28 déc. 2008 à 18:16
Cette question me laisse pantois; j'ai l'impression que tu as déjà bien potassé la question. En effet le problème du destructeur est délicat voire piégeux.
class A
{
  ...
};

class B : public A
{
  ...
};

// Si on défini:
A* a = new B;
// puis plus loin
delete a;
// Y'a un os car seul le destructeur A est appellé... et pourtant il s'agit d'un objet de class B
//Le problème est résolu en créant un destructeur virtual dans A, le polymorphisme forcera l'appel à celui de B.
virtual ~A() {}
0
DRSBMM > loupius
28 déc. 2008 à 18:24
mais tu a dit qu'on ne peut pas instancier la class abstraite ,dans ton exemple:
la classe A est abstraite il ne faut pas écrire :
A* a = new B;
n'est ce pas ?
0
loupius > DRSBMM
28 déc. 2008 à 18:38
Si on peut!
Je n'ai pas précisé mais c'est la classe A qui est abstraite (je pense que tu l'avais compris).
On peut car 'new B' renvoie un pointeur sur un objet de la classe B qui elle n'est pas abstraite.
Donc on ne crée pas d'instance de la classe A; d'autre part même en écrivant 'a = objet de classe B', il ne faut pas perdre de vue que l'objet en question reste de classe B et, en aucun cas, n'est transformé en un objet de classe A. C'est la raison pour laquelle le polymorphisme jouera par exemple lors de 'delete a' (et aussi à l'appel de toute fonction virtuelle déclarée dans A).
0