OVH Cloud OVH Cloud

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

7 réponses

1 2
Avatar
kanze
Jean-Marc Bourguet wrote in message
news:...
Loïc Joly writes:

Philippe Mesmeur wrote:

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?


Je ne suis pas sûr s'il parle du langage, ou de son utilisation. Ça
serait une bien mauvaise idée de créer un nouveau catégorie de type,
interface, in C++. Comme c'était une mauvaise idée en Java.

S'il parle de l'utilisation, c'est autre chose. J'utilise bien des
« interfaces » en C++. Mais la définition n'est pas la même que le mot
clé « interface » en Java -- en fait, même en Java, quand je veux écrire
une « interface » (sens logique), je suis obligée à utiliser une classe
abstraite, et non une interface (mot clé). Et encore, parce qu'en
générale, dans une classe d'interface, les fonctions virtuelles sont
privées, ce qui n'est même pas possible en Java.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16



Avatar
kanze
Philippe Mesmeur wrote in message
news:...

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 une définition de l'interface du type, sans l'implémentation de
son comportement.

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


Ne confondons pas le concepte et son implémentation. En C++, une
interface s'implémente au moyen d'une classe.

Note bien que même en Java, il n'est pas rare d'implémenter le concepte
d'interface au moyen d'une classe abstraite (c'est même la seule façon,
pour peu qu'on veut être rigueureux), et d'utiliser l'interface du
langage pour d'autres choses qui n'ont rien à voir avec le concepte
logique d'interface. En général, quelque soit le langage, il ne faut pas
s'attendre à ce que le fait qu'un mot clé du langage correspond à un
concepte qu'il y a identité entre les utilisations de ce mot clé et le
concepte.

En C++, l'idiome classique d'une interface, en ce qui me concerne, est :

class I
{
public:
virtual ~I() {}
void f()
{
// Vérifier les préconditions...
doF() ;
// Vérifier les postconditions...
}
int g()
{
// Vérifier les préconditions...
int result = doG() ;
// Vérifier les postconditions...
return result ;
}
// ...
protected:
I() {}

private:
I( I const& ) ;
I& operator=( I const& ) ;

private :
virtual void f() = 0 ;
virtual int g() = 0 ;
// ...
} ;

Le caractèristique principal, c'est que pour chaque fonction publique,
il y a une fonction privée virtuelle correspondante. Typiquement, il n'y
a pas de membres données, et le destructeur est inline pour qu'on voit
immédiatement qu'il n'a pas de sémantique. Les fonctions publiques
peuvent aussi être inline, parce que tout ce qu'elles contient est le
contrat, qui fait partie de l'interface. C'est aussi plutôt rare qu'une
interface supporte la copie et l'affectation, d'où les déclarations
privées (et la declaration du constructeur de copie fait qu'il me faut
une définition d'au moins un autre constructeur).

Mais c'est ma convention ; il y en a d'autres. Même chez moi, j'ai un
autre idiome pour les visiteurs et les callback (où les fonctions
virtuelles sont publiques), même si logiquement, il s'agit aussi d'une
sorte d'interface.

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?


Oui.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
Loïc Joly
wrote:

En C++, l'idiome classique d'une interface, en ce qui me concerne, est :

class I
{
public:
virtual ~I() {}
void f()
{
// Vérifier les préconditions...
doF() ;
// Vérifier les postconditions...
}
int g()
{
// Vérifier les préconditions...
int result = doG() ;
// Vérifier les postconditions...
return result ;
}
// ...
protected:
I() {}

private:
I( I const& ) ;
I& operator=( I const& ) ;

private :


// petite typo qui peut nuire à la compréhension :
virtual void f() = 0 ;
virtual void doF() = 0;

virtual int g() = 0 ;
virtual int doG() = 0;


--
Loïc

Avatar
Laurent DELEPINE
Loïc Joly wrote:

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


Comment fait on pour vérifer les pre et post conditions dans la classe
de base. L'une ou l'autre je vois, mais les deux, je seche.

LD


--
Vous avez souscris un forfait ADSL chez Free
Votre connexion est inutilisable a certaines heures
Free refuse de vous dépanner
Contactez :

Avatar
Loïc Joly
wrote:
Pourquoi serait-ce une plus mauvaise idee en C++ qu'en Java?



Je ne suis pas sûr s'il parle du langage, ou de son utilisation. Ça
serait une bien mauvaise idée de créer un nouveau catégorie de type,
interface, in C++. Comme c'était une mauvaise idée en Java.


C'est de ça dont je parle. La notion d'interface me va très bien, mais
je ne la voit assurément pas comme une classe sans code.

--
Loïc


Avatar
kanze
Laurent DELEPINE wrote in message
news:<400fc092$0$22320$...
Loïc Joly wrote:

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


Comment fait on pour vérifer les pre et post conditions dans la classe
de base. L'une ou l'autre je vois, mais les deux, je seche.


class Interface
{
public:
int f( int x )
{
// Vérifier les préconditions...
int result = doF( x ) ;
// Vérifier les postconditions...
return result ;
}

private:
virtual int doF( int x ) = 0 ;
} ;

Où est le problème ?

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
Laurent DELEPINE
wrote:
Laurent DELEPINE wrote in message
news:<400fc092$0$22320$...

Loïc Joly wrote:



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




Comment fait on pour vérifer les pre et post conditions dans la classe
de base. L'une ou l'autre je vois, mais les deux, je seche.



class Interface
{
public:
int f( int x )
{
// Vérifier les préconditions...
int result = doF( x ) ;
// Vérifier les postconditions...
return result ;
}

private:
virtual int doF( int x ) = 0 ;
} ;

Où est le problème ?


Vu comme ca evidement. Je cherchais avec une seule fonction membre.

Merci


LD
--
| _,,,---,,_ Laurent Delépine
ZZZzz /,`.-'`' -. ;-;;,_ mail :
|,4- ) )-,_. , ( `'-' http : http://www.webiologie.org
'---''(_/--' `-'_)



1 2