Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

destructeur d'une classe virtuelle pure

17 réponses
Avatar
Philippe Mesmeur
Hello,

J'ai un p'tit probleme de destructeur. Je voudrai creer une classe
virtuelle pure, c'est a dire une classe dont TOUTES les methodes sont
abstraites (virtual = 0) et qui n'a pas d'attributs.



exemple:

class I_A
{
public:
virtual void firstMethod() = 0;
virtual void secondMethod() = 0;
};


Cette classe est implementee par:

class A
{
public:
A();
~A();

public:
virtual void firstMethod();
virtual void secondMethod();
};

ma classe I_A est instanciee par:
I_A* myClass = new A();

cependant, j'ai un probleme pour le destructeur. quand je fais:
delete myClass;

je ne passe pas dans le corp de ~A()

Si je passe ~A() en virtuel ca ne change rien.

Si je declare un constructeur absatrait a I_A:
virtual ~I_A() = 0;
je linker me dis qu'il ne trouve pas la definition de ~I_A et ne peut
proceder.

Avez vous une idee de comment resoudre mon problem?
J'ai vaguement entendu parler de classes virtuelles (virtual class???)
ou d'heritage virtuel: est-ce la reponse a mon probleme?????

Merci beaucoup pour votre aide.


Philippe

10 réponses

1 2
Avatar
Loïc Joly
Philippe Mesmeur wrote:

Hello,

J'ai un p'tit probleme de destructeur. Je voudrai creer une classe
virtuelle pure, c'est a dire une classe dont TOUTES les methodes sont
abstraites (virtual = 0) et qui n'a pas d'attributs.


Ce n'est pas la définition d'une classe virtuelle pure. Ca correspond
plus à ce que JAVA appèlle une intrface, et qui est souvent AMA une
mauvaise idée en C++.

class I_A
{
public:
virtual void firstMethod() = 0;
virtual void secondMethod() = 0;
};



Tu n'as pas de destructeur virtuel, ce qui va te causer des problèmes.


Cette classe est implementee par:

class A
{
public:
A();
~A();

public:
virtual void firstMethod();
virtual void secondMethod();
};

ma classe I_A est instanciee par:
I_A* myClass = new A();

cependant, j'ai un probleme pour le destructeur. quand je fais:
delete myClass;

je ne passe pas dans le corp de ~A()


C'est encore pire que ça : Tu pourrais avoir un plantage complet de ton
programme.

Si je passe ~A() en virtuel ca ne change rien.
Normal



Si je declare un constructeur absatrait a I_A:
Destructeur, voulais tu dire.


virtual ~I_A() = 0;
je linker me dis qu'il ne trouve pas la definition de ~I_A et ne peut
proceder.


Normal, tu n'a pas défini cette fonction. Un destructeur virtuel doit
toujours être défini, puisqu'il sera automatiquement appelé par les
destructeurs des classes dérivées.


Avez vous une idee de comment resoudre mon problem?


Oui, défini ce destructeur : virtual ~I_A() {}
Tu peux même le déclarer =0 et le définir quand même, mais dans ce cas,
je considèrerais ça comme de l'obfuscation.

J'ai vaguement entendu parler de classes virtuelles (virtual class???)
ou d'heritage virtuel: est-ce la reponse a mon probleme?????


Non, l'héritage virtuel est en rapport avec l'héritage multiple.

--
Loïc

Avatar
Jean-Marc Bourguet
Philippe Mesmeur writes:

J'ai un p'tit probleme de destructeur. Je voudrai creer une
classe virtuelle pure, c'est a dire une classe dont TOUTES les
methodes sont abstraites (virtual = 0) et qui n'a pas d'attributs.


methode est un mot a eviter en C++, car ambigu (signifiant au choix
fonction membre ou fonction membre virtuelle)

exemple:

class I_A
{
public:
virtual void firstMethod() = 0;
virtual void secondMethod() = 0;
};


En regle generale, toute classe ayant des fonctions virtuelles doit
avoir son destructeur virtuel. (Ce n'est reellement necessaire que si
on detruit jamais qu'a partir d'un pointeur vers les classes les plus
derivees ce qui peut arriver par conception, auquel cas l'info est
utilisable, ou par chance, auquel cas il vaut mieux ne pas profiter de
la chose).

Cette classe est implementee par:

class A
{
public:
A();
~A();

public:
virtual void firstMethod();
virtual void secondMethod();
};

ma classe I_A est instanciee par:
I_A* myClass = new A();

cependant, j'ai un probleme pour le destructeur. quand je fais:
delete myClass;

je ne passe pas dans le corp de ~A()


Tu as de la chance, il pourrait arriver a peu pres n'importe quoi.

Si je passe ~A() en virtuel ca ne change rien.


C'est le destructeur de I_A qui doit etre virtuel.

Si je declare un constructeur absatrait a I_A:
virtual ~I_A() = 0;
je linker me dis qu'il ne trouve pas la definition de ~I_A et ne peut
proceder.


Toute fonction virtuelle pure peut etre definie. Le destructeur doit
etre definit. Par exemple de maniere inline, ce qu'il n'est pas
possible de faire dans la classe donc

inline I_A::~I_A()
{
}

Avez vous une idee de comment resoudre mon problem?
J'ai vaguement entendu parler de classes virtuelles (virtual class???) ou
d'heritage virtuel: est-ce la reponse a mon probleme?????


C'est la reponse a un autre probleme qui n'a lieu qu'avec de
l'heritage multiple (comment eviter qu'on herite plusieurs fois de la
meme classe de base), mais la description (aucun membre donnee) et le
nom (commencant par I_ pour interface je suppose) de ta classe laisse
a penser que heriter de I_A devrait etre fait de maniere virtuelle si
de l'heritage multiple se fait quelque par avec cette classe comme
classe de base.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Jean-Marc Bourguet
Loïc Joly writes:

Philippe Mesmeur wrote:

Hello,
J'ai un p'tit probleme de destructeur. Je voudrai creer une classe
virtuelle pure, c'est a dire une classe dont TOUTES les methodes sont
abstraites (virtual = 0) et qui n'a pas d'attributs.


Ce n'est pas la définition d'une classe virtuelle pure. Ca
correspond plus à ce que JAVA appèlle une intrface, et qui est
souvent AMA une mauvaise idée en C++.


Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Philippe Mesmeur
Merci de m'avoir repondu si rapidement :-)

Je suis tout a fait d'accord avec toi quand tu parles d'interface.
C'est meme ma signification que je donne au "I" de ma classe "I_A" ;-)

Pour moi, une interface est une definition mais pas une
implementation. C'est pour ca que je veux faire en sorte que ma classe
I_A ai toutes ces methodes abstraite, i.e. virtual = 0.

Ainsi, je voudrai faire en sorte qu'il n'y ai pas de code pour
I_A::~I_A(); D'apres ce que je comprend de ta reponse, tu me dis que je
suis quand meme oblige de le faire, meme si c'est du code vide, style:

I_A::~I_A()
{}

C'est bien ca?

Encore merci

Loïc Joly wrote:
Philippe Mesmeur wrote:

Hello,

J'ai un p'tit probleme de destructeur. Je voudrai creer une classe
virtuelle pure, c'est a dire une classe dont TOUTES les methodes sont
abstraites (virtual = 0) et qui n'a pas d'attributs.



Ce n'est pas la définition d'une classe virtuelle pure. Ca correspond
plus à ce que JAVA appèlle une intrface, et qui est souvent AMA une
mauvaise idée en C++.

class I_A
{
public:
virtual void firstMethod() = 0;
virtual void secondMethod() = 0;
};



Tu n'as pas de destructeur virtuel, ce qui va te causer des problèmes.


Cette classe est implementee par:

class A
{
public:
A();
~A();

public:
virtual void firstMethod();
virtual void secondMethod();
};

ma classe I_A est instanciee par:
I_A* myClass = new A();

cependant, j'ai un probleme pour le destructeur. quand je fais:
delete myClass;

je ne passe pas dans le corp de ~A()



C'est encore pire que ça : Tu pourrais avoir un plantage complet de ton
programme.

Si je passe ~A() en virtuel ca ne change rien.


Normal


Si je declare un constructeur absatrait a I_A:


Destructeur, voulais tu dire.

virtual ~I_A() = 0;
je linker me dis qu'il ne trouve pas la definition de ~I_A et ne peut
proceder.



Normal, tu n'a pas défini cette fonction. Un destructeur virtuel doit
toujours être défini, puisqu'il sera automatiquement appelé par les
destructeurs des classes dérivées.


Avez vous une idee de comment resoudre mon problem?



Oui, défini ce destructeur : virtual ~I_A() {}
Tu peux même le déclarer =0 et le définir quand même, mais dans ce cas,
je considèrerais ça comme de l'obfuscation.

J'ai vaguement entendu parler de classes virtuelles (virtual class???)
ou d'heritage virtuel: est-ce la reponse a mon probleme?????



Non, l'héritage virtuel est en rapport avec l'héritage multiple.




Avatar
Michel Michaud
Dans news:, Philippe Mesmeur
Pour moi, une interface est une definition mais pas une


Définition ou plutôt déclaration ?

implementation. C'est pour ca que je veux faire en sorte que ma
classe I_A ai toutes ces methodes abstraite, i.e. virtual = 0.


Pourquoi ?


Ainsi, je voudrai faire en sorte qu'il n'y ai pas de code pour
I_A::~I_A(); D'apres ce que je comprend de ta reponse, tu me dis


Pourquoi c'est important qu'il n'y ait pas de code ? Ça me paraît
une drôle de contrainte...

que je suis quand meme oblige de le faire, meme si c'est du code
vide, style:

I_A::~I_A()
{}

C'est bien ca?


Oui. Mais encore une fois, pourquoi veux-tu forcer ceux qui
hériteront à définir un constructeur (c'est ce qui arrivera si
tu le déclares avec = 0, même si tu fournis la fonction vide) ?
Comment sais-tu qu'il y aura un besoin d'y mettre quelque
chose dans les classes dérivées ?

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Christophe Lephay
Jean-Marc Bourguet wrote:
Loïc Joly writes:
Ce n'est pas la définition d'une classe virtuelle pure. Ca
correspond plus à ce que JAVA appèlle une intrface, et qui est
souvent AMA une mauvaise idée en C++.


Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?


Parce qu'en C++ on peut faire autrement ?

Chris


Avatar
Vincent Richard

Jean-Marc Bourguet wrote:
Loïc Joly writes:
Ce n'est pas la définition d'une classe virtuelle pure. Ca
correspond plus à ce que JAVA appèlle une intrface, et qui est
souvent AMA une mauvaise idée en C++.


Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?


Parce qu'en C++ on peut faire autrement ?


Je suis curieux de découvrir les alternatives (si ça se trouve, je les
connais peut-être déjà, mais ça ne me saute pas aux yeux dans ce cas
précis...).

Merci d'avance.

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/



Avatar
Loïc Joly
Jean-Marc Bourguet wrote:

Loïc Joly writes:


Philippe Mesmeur wrote:


Hello,
J'ai un p'tit probleme de destructeur. Je voudrai creer une classe
virtuelle pure, c'est a dire une classe dont TOUTES les methodes sont
abstraites (virtual = 0) et qui n'a pas d'attributs.


Ce n'est pas la définition d'une classe virtuelle pure. Ca
correspond plus à ce que JAVA appèlle une intrface, et qui est
souvent AMA une mauvaise idée en C++.



Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?


Parce qu'en JAVA, comme on n'a qu'une version limitée à ce que JAVA
appelle interface de l'héritage multiple, on ne peut souvent pas faire
autrement.

En C++, on peut dans la classe de base vérifier les pré/post-conditions,
alors pourquoi s'en priver !

--
Loïc



Avatar
Jean-Marc Bourguet
"Christophe Lephay" writes:

Jean-Marc Bourguet wrote:
Loïc Joly writes:
Ce n'est pas la définition d'une classe virtuelle pure. Ca
correspond plus à ce que JAVA appèlle une intrface, et qui est
souvent AMA une mauvaise idée en C++.


Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?


Parce qu'en C++ on peut faire autrement ?


Qu'est-ce qu'on peut faire autrement? (Je ne sais pas pour quoi c'est
utilise en Java... et l'exemple qui a commence la discussion est
suffisemment peu explicite sur ses intentions pour que je n'arrive pas
a donner un avis sur l'oportunite d'utiliser cette technique).

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Jean-Marc Bourguet
Loïc Joly writes:

Jean-Marc Bourguet wrote:

Loïc Joly writes:

Philippe Mesmeur wrote:


Hello,
J'ai un p'tit probleme de destructeur. Je voudrai creer une classe
virtuelle pure, c'est a dire une classe dont TOUTES les methodes sont
abstraites (virtual = 0) et qui n'a pas d'attributs.


Ce n'est pas la définition d'une classe virtuelle pure. Ca
correspond plus à ce que JAVA appèlle une intrface, et qui est
souvent AMA une mauvaise idée en C++.
Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?



Parce qu'en JAVA, comme on n'a qu'une version limitée à ce que JAVA appelle
interface de l'héritage multiple, on ne peut souvent pas faire autrement.

En C++, on peut dans la classe de base vérifier les pré/post-conditions,
alors pourquoi s'en priver !


Si c'est simplement a cause du manque de membre non virtuel en Java,
ce n'est pas quelque chose qui me semble fondamentalement different.
Ce que je jugerais fondamentalement different, c'est l'utilisation de
membres donnees.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org




1 2