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

virtual method ??

7 réponses
Avatar
Jean Marc
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 ?
Merci

7 réponses

Avatar
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

Avatar
Philippe
Pour être plus clair, voilà un petit exemple sur le "virtual" :


#include <stdio.h>

class A {
public:
void methodeNonVirtual()
{ printf("A::methodeNonVirtual()n"); }

virtual void methodeVirtual()
{ printf("A::methodeVirtual()n"); }
};

class B : public A {
public:
void methodeNonVirtual()
{ printf("B::methodeNonVirtual()n"); }

void methodeVirtual()
{ printf("B::methodeVirtual()n"); }
};

int main() {
printf("A an");

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;
}
Avatar
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"); }

virtual void methodeVirtual()
{ printf("A::methodeVirtual()n"); }
};

class B : public A {
public:
void methodeNonVirtual()
{ printf("B::methodeNonVirtual()n"); }

void methodeVirtual()
{ printf("B::methodeVirtual()n"); }
};

int main() {
printf("A an");

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;
}




Avatar
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

Avatar
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(); }

--
;-)


Avatar
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


Avatar
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