| View previous topic :: View next topic |
| Author |
Message |
Cyrille cns Szymanski Guest
|
Posted: Fri Jan 02, 2004 3:48 pm Post subject: fonction membre virtuelle dans un destructeur |
|
|
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
|
Posted: Fri Jan 02, 2004 3:54 pm Post subject: Re: fonction membre virtuelle dans un destructeur |
|
|
| 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
|
Posted: Fri Jan 02, 2004 4:35 pm Post subject: Re: fonction membre virtuelle dans un destructeur |
|
|
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
|
Posted: Fri Jan 02, 2004 5:10 pm Post subject: Re: fonction membre virtuelle dans un destructeur |
|
|
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
|
Posted: Fri Jan 02, 2004 11:45 pm Post subject: Re: fonction membre virtuelle dans un destructeur |
|
|
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
|
Posted: Sat Jan 03, 2004 4:57 pm Post subject: Re: fonction membre virtuelle dans un destructeur |
|
|
| 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 |
|
 |
|