C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

fonction membre virtuelle dans un destructeur

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Cyrille cns Szymanski
Guest





PostPosted: Fri Jan 02, 2004 3:48 pm    Post subject: fonction membre virtuelle dans un destructeur Reply with quote



Bonjour,

je cherche à appeler une fonction membre virtuelle dans un destructeur
mais cela ne fonctionne pas comme je l'aurais espéré.

struct A {
void print() { do_print(); }
~A() { do_print(); }
virtual void do_print() { cout << "A"; }
};

Dans print(), l'appel est bien fait à partir du pointeur virtuel do_print
alors que dans le destructeur l'appel se fait sur A::do_print().

C'est encore pire si do_print() est virtuelle pure, le compilateur ne
râle même pas.

struct B : public A {
void do_print() { cout << "B"; }
};

int main()
{
B b;
b.print();
// affiche BA
// alors que le corps de ~A() et de print() est le même
}

Quelqu'un peut-il m'expliquer les raisons de cela ?

J'utilise BCC 5.5.1


D'avance merci
--
_|_|_| CnS
_|_| for(n=0;b;n++)
_| b&=b-1; /*pp.47 K&R*/
Back to top
Cyrille cns Szymanski
Guest





PostPosted: Fri Jan 02, 2004 3:54 pm    Post subject: Re: fonction membre virtuelle dans un destructeur Reply with quote



Quote:
je cherche à appeler une fonction membre virtuelle dans un destructeur
mais cela ne fonctionne pas comme je l'aurais espéré.

"In constructors and destructor, the dynamic type of an object equates
its static type, meaning that the virtual fonction is statically
resolved to A::f." --Gabriel Dos Reis

C'est curieux.

--
_|_|_| CnS
_|_| for(n=0;b;n++)
_| b&=b-1; /*pp.47 K&R*/

Back to top
Fabien SK
Guest





PostPosted: Fri Jan 02, 2004 4:35 pm    Post subject: Re: fonction membre virtuelle dans un destructeur Reply with quote



Cyrille "cns" Szymanski wrote:
Quote:
je cherche à appeler une fonction membre virtuelle dans un destructeur
mais cela ne fonctionne pas comme je l'aurais espéré.


"In constructors and destructor, the dynamic type of an object equates
its static type, meaning that the virtual fonction is statically
resolved to A::f." --Gabriel Dos Reis

C'est curieux.

D'un coté, c'est logique que ça pose des problèmes. Exemple:

class Base
{
public:
~Base()
{
DoIt();
}
protected:
virtual void DoIt(){}
};

class Fille:public Base
{
protected:
void DoIt(){ std::cout << m_Texte << std::endl; }
std::string m_Texte;
};

L'ordre d'appel est:
- destructeur de "Fille"
- destructeur des membres de "Fille"
- destructeur de "Base"

Quand le destructeur de "Base" appelle "DoIt" (donc "Fille::DoIt"), hors
"Fille" et ses membres ont déjà été détruits, d'où catastrophe.


Back to top
Jorge Rivera
Guest





PostPosted: Fri Jan 02, 2004 5:10 pm    Post subject: Re: fonction membre virtuelle dans un destructeur Reply with quote

Avez vous essayez de declarer le destructeur de A vituel?

Je crois que un destructeur virtuel n'appelera pas A::do_print(), mais
do_print() de l'object dynamique...

Je veut dire (excusez mon francais...):

class A{
public:
A(){}
virtual void ~A(){ do_print(); }
public:
void print(){ do_print(); }
private:
virtual void do_print(){ cout<<"A"; }
};

Cyrille "cns" Szymanski wrote:
Quote:
Bonjour,

je cherche à appeler une fonction membre virtuelle dans un destructeur
mais cela ne fonctionne pas comme je l'aurais espéré.

struct A {
void print() { do_print(); }
~A() { do_print(); }
virtual void do_print() { cout << "A"; }
};

Dans print(), l'appel est bien fait à partir du pointeur virtuel do_print
alors que dans le destructeur l'appel se fait sur A::do_print().

C'est encore pire si do_print() est virtuelle pure, le compilateur ne
râle même pas.

struct B : public A {
void do_print() { cout << "B"; }
};

int main()
{
B b;
b.print();
// affiche BA
// alors que le corps de ~A() et de print() est le même
}

Quelqu'un peut-il m'expliquer les raisons de cela ?

J'utilise BCC 5.5.1


D'avance merci

Back to top
Fabien LE LEZ
Guest





PostPosted: Fri Jan 02, 2004 11:45 pm    Post subject: Re: fonction membre virtuelle dans un destructeur Reply with quote

On Fri, 02 Jan 2004 17:10:38 GMT, Jorge Rivera
<jorgeri (AT) rochester (DOT) rr.com> wrote:

Quote:
Je crois que un destructeur virtuel n'appelera pas A::do_print(), mais
do_print() de l'object dynamique...

Non. L'"objet dynamique" n'existe déjà plus.

--
;-)

http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2

Back to top
Cyrille cns Szymanski
Guest





PostPosted: Sat Jan 03, 2004 4:57 pm    Post subject: Re: fonction membre virtuelle dans un destructeur Reply with quote

Quote:
Avez vous essayez de declarer le destructeur de A vituel?

Je crois que un destructeur virtuel n'appelera pas A::do_print(), mais
do_print() de l'object dynamique...

J'ai essayé mais malheureusement cela ne fonctionne pas.

Tout est clair à présent que Fabien m'a dit de regarder l'ordre d'appel des
destructeurs.

--
_|_|_| CnS
_|_| for(n=0;b;n++)
_| b&=b-1; /*pp.47 K&R*/

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.