J'ai recompilé un source ancine nécessitant quelques modifs, la compilation
se passe bien puis à l'éxecution j'ai un beau "pure virtual method called"
puis un exit du programme !! Qu'est-ce ?
Merci
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Philippe
Bjr à toutes et tous, Salut,
J'ai recompilé un source ancine nécessitant quelques modifs, la compilation
se passe bien puis à l'éxecution j'ai un beau "pure virtual method called" puis un exit du programme !! Qu'est-ce ?
Tu peux définir une méthode comme étant "virtual". Ca signifie que lorsque tu appelles cette methode, le prog a appelle de la "vraie" méthode, celle que tu as redéfinis dans des sous classes... (oula , c'est peu clair !)
Enfin bref, tu peut definir un comportement par defaut de cette methode ou pas. Dans ce cas (pas de definition) cette méthode virtuelle est pure.
Dans ton cas, tu as surement appellé une de ces méthodes. Elles n'ont pas de definition (juste la signature) donc tu peux pas l'invoquer !
Ce qu'il faudrait faire, c'est dériver la classe en question est implementer cette méthode, qui ne sera donc plus virtuelle
Suis-je assez clair :o) ? ou non :o( ?
Merci De rien !
-- Philippe
Bjr à toutes et tous,
Salut,
J'ai recompilé un source ancine nécessitant quelques modifs, la
compilation
se passe bien puis à l'éxecution j'ai un beau "pure virtual method called"
puis un exit du programme !! Qu'est-ce ?
Tu peux définir une méthode comme étant "virtual".
Ca signifie que lorsque tu appelles cette methode, le prog a appelle de la
"vraie" méthode, celle que tu as redéfinis dans des sous classes...
(oula , c'est peu clair !)
Enfin bref, tu peut definir un comportement par defaut de cette methode ou
pas.
Dans ce cas (pas de definition) cette méthode virtuelle est pure.
Dans ton cas, tu as surement appellé une de ces méthodes. Elles n'ont pas de
definition (juste la signature)
donc tu peux pas l'invoquer !
Ce qu'il faudrait faire, c'est dériver la classe en question est implementer
cette méthode, qui ne sera donc plus virtuelle
J'ai recompilé un source ancine nécessitant quelques modifs, la compilation
se passe bien puis à l'éxecution j'ai un beau "pure virtual method called" puis un exit du programme !! Qu'est-ce ?
Tu peux définir une méthode comme étant "virtual". Ca signifie que lorsque tu appelles cette methode, le prog a appelle de la "vraie" méthode, celle que tu as redéfinis dans des sous classes... (oula , c'est peu clair !)
Enfin bref, tu peut definir un comportement par defaut de cette methode ou pas. Dans ce cas (pas de definition) cette méthode virtuelle est pure.
Dans ton cas, tu as surement appellé une de ces méthodes. Elles n'ont pas de definition (juste la signature) donc tu peux pas l'invoquer !
Ce qu'il faudrait faire, c'est dériver la classe en question est implementer cette méthode, qui ne sera donc plus virtuelle
Suis-je assez clair :o) ? ou non :o( ?
Merci De rien !
-- Philippe
Philippe
Pour être plus clair, voilà un petit exemple sur le "virtual" :
#include <stdio.h>
class A { public: void methodeNonVirtual() { printf("A::methodeNonVirtual()n"); }
A a; a.methodeNonVirtual(); // pas de pb a.methodeVirtual(); // correcte car implementé // provoque le dit bug sinon // -------------------------- printf("nB bn");
B b; b.methodeNonVirtual(); // normal b.methodeVirtual(); // normal aussi // --------------------------- printf("nB *pb = (B*) &an");
B *pb = (B*) &a; // je fait passer un A pour un B
pb->methodeNonVirtual(); // non virtual => reste dans le type declaré (B)
pb->methodeVirtual(); // virtual => descend dans le type d'origine (A)
return 0; }
Pour être plus clair, voilà un petit exemple sur le "virtual" :
#include <stdio.h>
class A {
public:
void methodeNonVirtual()
{ printf("A::methodeNonVirtual()n"); }
A a;
a.methodeNonVirtual(); // pas de pb
a.methodeVirtual(); // correcte car implementé
// provoque le dit bug sinon
// --------------------------
printf("nB bn");
B b;
b.methodeNonVirtual(); // normal
b.methodeVirtual(); // normal aussi
// ---------------------------
printf("nB *pb = (B*) &an");
B *pb = (B*) &a;
// je fait passer un A pour un B
pb->methodeNonVirtual();
// non virtual => reste dans le type declaré (B)
pb->methodeVirtual();
// virtual => descend dans le type d'origine (A)
A a; a.methodeNonVirtual(); // pas de pb a.methodeVirtual(); // correcte car implementé // provoque le dit bug sinon // -------------------------- printf("nB bn");
B b; b.methodeNonVirtual(); // normal b.methodeVirtual(); // normal aussi // --------------------------- printf("nB *pb = (B*) &an");
B *pb = (B*) &a; // je fait passer un A pour un B
pb->methodeNonVirtual(); // non virtual => reste dans le type declaré (B)
pb->methodeVirtual(); // virtual => descend dans le type d'origine (A)
return 0; }
Jean Marc
Merci, j'ai à peu près compris, mais ce qui m'étonne c'est que ce source fonctionnait parfaitement jadis (avec pgcc2.91) et qu'aujourd'hui sans modifications particulières des classes ça ne marche plus (gcc2.96), est-ce lié au compilateur ? De toute manière, suite à vos explications, je vais chercher dans mon source ! Merci encore ;-)
"Philippe" a écrit dans le message de news: bsk7vb$7rr$
Pour être plus clair, voilà un petit exemple sur le "virtual" :
#include <stdio.h>
class A { public: void methodeNonVirtual() { printf("A::methodeNonVirtual()n"); }
A a; a.methodeNonVirtual(); // pas de pb a.methodeVirtual(); // correcte car implementé // provoque le dit bug sinon // -------------------------- printf("nB bn");
B b; b.methodeNonVirtual(); // normal b.methodeVirtual(); // normal aussi // --------------------------- printf("nB *pb = (B*) &an");
B *pb = (B*) &a; // je fait passer un A pour un B
pb->methodeNonVirtual(); // non virtual => reste dans le type declaré (B)
pb->methodeVirtual(); // virtual => descend dans le type d'origine (A)
return 0; }
Merci, j'ai à peu près compris, mais ce qui m'étonne c'est que ce source
fonctionnait parfaitement jadis (avec pgcc2.91) et qu'aujourd'hui sans
modifications particulières des classes ça ne marche plus (gcc2.96), est-ce
lié au compilateur ?
De toute manière, suite à vos explications, je vais chercher dans mon source
!
Merci encore ;-)
"Philippe" <nobody@nowhere.com> a écrit dans le message de news:
bsk7vb$7rr$1@news-reader5.wanadoo.fr...
Pour être plus clair, voilà un petit exemple sur le "virtual" :
#include <stdio.h>
class A {
public:
void methodeNonVirtual()
{ printf("A::methodeNonVirtual()n"); }
A a;
a.methodeNonVirtual(); // pas de pb
a.methodeVirtual(); // correcte car implementé
// provoque le dit bug sinon
// --------------------------
printf("nB bn");
B b;
b.methodeNonVirtual(); // normal
b.methodeVirtual(); // normal aussi
// ---------------------------
printf("nB *pb = (B*) &an");
B *pb = (B*) &a;
// je fait passer un A pour un B
pb->methodeNonVirtual();
// non virtual => reste dans le type declaré (B)
pb->methodeVirtual();
// virtual => descend dans le type d'origine (A)
Merci, j'ai à peu près compris, mais ce qui m'étonne c'est que ce source fonctionnait parfaitement jadis (avec pgcc2.91) et qu'aujourd'hui sans modifications particulières des classes ça ne marche plus (gcc2.96), est-ce lié au compilateur ? De toute manière, suite à vos explications, je vais chercher dans mon source ! Merci encore ;-)
"Philippe" a écrit dans le message de news: bsk7vb$7rr$
Pour être plus clair, voilà un petit exemple sur le "virtual" :
#include <stdio.h>
class A { public: void methodeNonVirtual() { printf("A::methodeNonVirtual()n"); }
A a; a.methodeNonVirtual(); // pas de pb a.methodeVirtual(); // correcte car implementé // provoque le dit bug sinon // -------------------------- printf("nB bn");
B b; b.methodeNonVirtual(); // normal b.methodeVirtual(); // normal aussi // --------------------------- printf("nB *pb = (B*) &an");
B *pb = (B*) &a; // je fait passer un A pour un B
pb->methodeNonVirtual(); // non virtual => reste dans le type declaré (B)
pb->methodeVirtual(); // virtual => descend dans le type d'origine (A)
return 0; }
Loïc Joly
Jean Marc wrote:
Bjr à toutes et tous,
J'ai recompilé un source ancine nécessitant quelques modifs, la compilation se passe bien puis à l'éxecution j'ai un beau "pure virtual method called" puis un exit du programme !! Qu'est-ce ?
Il me semble que ce message d'erreur viens de gcc, et dans notre code, il arrivait quand on essayait d'appeler une méthode virtuelle pure depuis le constructeur d'un objet père (rappel ; Dans un constructeur ou un destructeur, les appels de fonction sont résolus statiquements).
Par exemple :
class A { A(); virtual void f() = 0; }
A::A() { f(); }
-- Loïc
Jean Marc wrote:
Bjr à toutes et tous,
J'ai recompilé un source ancine nécessitant quelques modifs, la compilation
se passe bien puis à l'éxecution j'ai un beau "pure virtual method called"
puis un exit du programme !! Qu'est-ce ?
Il me semble que ce message d'erreur viens de gcc, et dans notre code,
il arrivait quand on essayait d'appeler une méthode virtuelle pure
depuis le constructeur d'un objet père (rappel ; Dans un constructeur ou
un destructeur, les appels de fonction sont résolus statiquements).
J'ai recompilé un source ancine nécessitant quelques modifs, la compilation se passe bien puis à l'éxecution j'ai un beau "pure virtual method called" puis un exit du programme !! Qu'est-ce ?
Il me semble que ce message d'erreur viens de gcc, et dans notre code, il arrivait quand on essayait d'appeler une méthode virtuelle pure depuis le constructeur d'un objet père (rappel ; Dans un constructeur ou un destructeur, les appels de fonction sont résolus statiquements).
Par exemple :
class A { A(); virtual void f() = 0; }
A::A() { f(); }
-- Loïc
Fabien LE LEZ
On 31 Dec 2003 03:39:08 +0100, drkm <fr.comp.lang.c++@fgeorges.org> wrote:
A::A() { f(); }
Et il ne le détecte pas à la compilation ?
C'est plus compliqué qu'il n'y paraît :
machin.h
class A { A(); virtual void f() = 0; void g(); };
machin1.cpp
A::A() { g(); }
machin2.cpp
void A::g() { f(); }
-- ;-)
On 31 Dec 2003 03:39:08 +0100, drkm <fr.comp.lang.c++@fgeorges.org>
wrote:
On 31 Dec 2003 03:39:08 +0100, drkm <fr.comp.lang.c++@fgeorges.org> wrote:
A::A() { f(); }
Et il ne le détecte pas à la compilation ?
C'est plus compliqué qu'il n'y paraît :
machin.h
class A { A(); virtual void f() = 0; void g(); };
machin1.cpp
A::A() { g(); }
machin2.cpp
void A::g() { f(); }
-- ;-)
drkm
Loïc Joly writes:
Jean Marc wrote:
Bjr à toutes et tous,
J'ai recompilé un source ancine nécessitant quelques modifs, la compilation se passe bien puis à l'éxecution j'ai un beau "pure virtual method called" puis un exit du programme !! Qu'est-ce ?
Il me semble que ce message d'erreur viens de gcc, et dans notre code, il arrivait quand on essayait d'appeler une méthode virtuelle pure depuis le constructeur d'un objet père (rappel ; Dans un constructeur ou un destructeur, les appels de fonction sont résolus statiquements).
Par exemple :
class A { A(); virtual void f() = 0; }
A::A() { f(); }
Et il ne le détecte pas à la compilation ?
--drkm
Loïc Joly <loic.actarus.joly@wanadoo.fr> writes:
Jean Marc wrote:
Bjr à toutes et tous,
J'ai recompilé un source ancine nécessitant quelques modifs, la
compilation se passe bien puis à l'éxecution j'ai un beau "pure
virtual method called" puis un exit du programme !! Qu'est-ce ?
Il me semble que ce message d'erreur viens de gcc, et dans notre
code, il arrivait quand on essayait d'appeler une méthode virtuelle
pure depuis le constructeur d'un objet père (rappel ; Dans un
constructeur ou un destructeur, les appels de fonction sont résolus
statiquements).
J'ai recompilé un source ancine nécessitant quelques modifs, la compilation se passe bien puis à l'éxecution j'ai un beau "pure virtual method called" puis un exit du programme !! Qu'est-ce ?
Il me semble que ce message d'erreur viens de gcc, et dans notre code, il arrivait quand on essayait d'appeler une méthode virtuelle pure depuis le constructeur d'un objet père (rappel ; Dans un constructeur ou un destructeur, les appels de fonction sont résolus statiquements).
Par exemple :
class A { A(); virtual void f() = 0; }
A::A() { f(); }
Et il ne le détecte pas à la compilation ?
--drkm
drkm
Fabien LE LEZ writes:
On 31 Dec 2003 03:39:08 +0100, drkm <fr.comp.lang.c++@fgeorges.org> wrote:
A::A() { f(); }
Et il ne le détecte pas à la compilation ?
C'est plus compliqué qu'il n'y paraît :
machin.h
class A { A(); virtual void f() = 0; void g(); };
machin1.cpp
A::A() { g(); }
machin2.cpp
void A::g() { f(); }
Ok. Ca me rassure. D'ailleurs, un teste rapide me crache au visage :
fclc++.cc: In constructor `A::A()': fclc++.cc:9: abstract virtual `virtual void A::f()' called from constructor
Ouf !
--drkm
Fabien LE LEZ <gramster@gramster.com> writes:
On 31 Dec 2003 03:39:08 +0100, drkm <fr.comp.lang.c++@fgeorges.org>
wrote:
A::A()
{
f();
}
Et il ne le détecte pas à la compilation ?
C'est plus compliqué qu'il n'y paraît :
machin.h
class A
{
A();
virtual void f() = 0;
void g();
};
machin1.cpp
A::A() { g(); }
machin2.cpp
void A::g() { f(); }
Ok. Ca me rassure. D'ailleurs, un teste rapide me crache au
visage :
fclc++.cc: In constructor `A::A()':
fclc++.cc:9: abstract virtual `virtual void A::f()' called from
constructor