Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1762 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [Résolu] Problème d'héritage d'héritage + redéfinition de méthode

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Problème d'héritage d'héritage + redéfinition de méthode

n°1309563
Olivier51
Posté le 20-02-2006 à 12:46:56  profilanswer
 

Voilà mon code source :
 

Code :
  1. class TestA {
  2.         public:
  3.                 virtual void A() = 0;
  4.                 void B();
  5. };
  6. class TestB : public TestA {
  7.         public:
  8.                 void A() { }
  9. };
  10. class TestC : public TestB {
  11.         public:
  12.                 void C();
  13. };
  14. int main() {
  15.         TestC* c = new TestC();
  16.         return 0;
  17. }


 
Et le résultat de la compilation (enfin du linkage) :

Test.o: In function `main':Test.cpp:(.text+0x25): référence indéfinie vers « operator new(unsigned int)»
Test.o:(.gnu.linkonce.r._ZTI5TestC[typeinfo for TestC]+0x0): référence indéfinie vers « vtable for __cxxabiv1::__si_class_type_info»
Test.o:(.gnu.linkonce.r._ZTI5TestB[typeinfo for TestB]+0x0): référence indéfinie vers « vtable for __cxxabiv1::__si_class_type_info»
Test.o:(.gnu.linkonce.r._ZTI5TestA[typeinfo for TestA]+0x0): référence indéfinie vers « vtable for __cxxabiv1::__class_type_info»
Test.o:(.gnu.linkonce.r._ZTV5TestA[vtable for TestA]+0x8): référence indéfinie vers « __cxa_pure_virtual »
Test.o:(.eh_frame+0x11): référence indéfinie vers « __gxx_personality_v0 »
collect2: ld returned 1 exit status


 
Je ne vois pas trop l'erreur ...


Message édité par Olivier51 le 20-02-2006 à 14:39:55
mood
Publicité
Posté le 20-02-2006 à 12:46:56  profilanswer
 

n°1309579
FrozenPala​din
Posté le 20-02-2006 à 13:18:14  profilanswer
 

Code :
  1. TestC* c = new TestC;


Parce que les parentheses signifient ici l'appel explicite au contructeur TestC(void) qui n'existe pas ainsi que TestB(void) et TestA(void)
Enleve les parentheses ou ajoutes les 3 constructeurs.

n°1309604
Olivier51
Posté le 20-02-2006 à 13:36:17  profilanswer
 

C'est vrai, j'avais oublié cette règle ...
 
On y est pas encore, mais ça va un peu mieux ...
 

Test.o: In function `main':Test.cpp:(.text+0x25): référence indéfinie vers « operator new(unsigned int)»
Test.o:(.gnu.linkonce.r._ZTI5TestC[typeinfo for TestC]+0x0): référence indéfinie vers « vtable for __cxxabiv1::__si_class_type_info»
Test.o:(.gnu.linkonce.r._ZTI5TestB[typeinfo for TestB]+0x0): référence indéfinie vers « vtable for __cxxabiv1::__si_class_type_info»
Test.o:(.gnu.linkonce.r._ZTI5TestA[typeinfo for TestA]+0x0): référence indéfinie vers « vtable for __cxxabiv1::__class_type_info»
Test.o:(.gnu.linkonce.r._ZTV5TestA[vtable for TestA]+0x8): référence indéfinie vers « __cxa_pure_virtual »
Test.o:(.eh_frame+0x11): référence indéfinie vers « __gxx_personality_v0 »
collect2: ld returned 1 exit status

n°1309606
Taz
bisounours-codeur
Posté le 20-02-2006 à 13:38:13  profilanswer
 

mets un destructeur virtuel

n°1309608
FrozenPala​din
Posté le 20-02-2006 à 13:40:01  profilanswer
 

[quotemsg=1309563,1,37596]

Code :
  1. class TestB : public TestA {
  2.         public:
  3.                 void A() { };
  4. };

quotemsg]
 
; apres l'override de virtual void A() dans TestB

n°1309629
Olivier51
Posté le 20-02-2006 à 14:02:21  profilanswer
 

Pas mieux ...
 
Le code actuellement :

Code :
  1. class TestA {
  2.         public:
  3.                 virtual void A() = 0;
  4.                 virtual ~TestA() {}
  5.                 void B();
  6. };
  7. class TestB : public TestA {
  8.         public:
  9.                 virtual void A() { };
  10. };
  11. class TestC : public TestB {
  12.         public:
  13.                 void C();
  14. };
  15. int main() {
  16.         TestC* c = new TestC;
  17.         return 0;
  18. }


 
Le résultat :

Test.o: In function `main':Test.cpp:(.text+0x25): référence indéfinie vers « operator new(unsigned int)»
Test.o:(.gnu.linkonce.r._ZTI5TestC[typeinfo for TestC]+0x0): référence indéfinie vers « vtable for __cxxabiv1::__si_class_type_info»
Test.o:(.gnu.linkonce.r._ZTI5TestB[typeinfo for TestB]+0x0): référence indéfinie vers « vtable for __cxxabiv1::__si_class_type_info»
Test.o:(.gnu.linkonce.r._ZTI5TestA[typeinfo for TestA]+0x0): référence indéfinie vers « vtable for __cxxabiv1::__class_type_info»
Test.o:(.gnu.linkonce.r._ZTV5TestA[vtable for TestA]+0x8): référence indéfinie vers « __cxa_pure_virtual »
Test.o: In function `TestA::~TestA()':Test.cpp:(.gnu.linkonce.t._ZN5TestAD2Ev[TestA::~TestA()]+0x20): référence indéfinie vers « operator delete(void*)»
Test.o: In function `TestA::~TestA()':Test.cpp:(.gnu.linkonce.t._ZN5TestAD1Ev[TestA::~TestA()]+0x20): référence indéfinie vers « operator delete(void*)»
Test.o: In function `TestA::~TestA()':Test.cpp:(.gnu.linkonce.t._ZN5TestAD0Ev[TestA::~TestA()]+0x20): référence indéfinie vers « operator delete(void*)»
Test.o: In function `TestB::~TestB()':Test.cpp:(.gnu.linkonce.t._ZN5TestBD2Ev[TestB::~TestB()]+0x2b): référence indéfinie vers « operator delete(void*)»
Test.o: In function `TestB::~TestB()':Test.cpp:(.gnu.linkonce.t._ZN5TestBD1Ev[TestB::~TestB()]+0x2b): référence indéfinie vers « operator delete(void*)»
Test.o:Test.cpp:(.gnu.linkonce.t._ZN5TestBD0Ev[TestB::~TestB()]+0x2b): encore plus de références indéfinies suivent vers « operator delete(void*)»
Test.o:(.eh_frame+0x11): référence indéfinie vers « __gxx_personality_v0 »
collect2: ld returned 1 exit status


Message édité par Olivier51 le 20-02-2006 à 14:05:30
n°1309633
FrozenPala​din
Posté le 20-02-2006 à 14:09:44  profilanswer
 

Bizarre chez moi ca compile nickel (VC++ 8)  :o

n°1309635
Taz
bisounours-codeur
Posté le 20-02-2006 à 14:12:01  profilanswer
 

bah g++ 4 aussi.

n°1309657
Olivier51
Posté le 20-02-2006 à 14:37:55  profilanswer
 

olivier@olivier:/tmp$ g++ -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-werror --with-tune=i686 --enable-checking=release i486-linux-gnu
Thread model: posix
gcc version 4.0.3 20060128 (prerelease) (Debian 4.0.2-8)
olivier@olivier:/tmp$


 
et pour compiler :

gcc -c Test.cpp && gcc -o Test Test.o

n°1309662
Olivier51
Posté le 20-02-2006 à 14:39:30  profilanswer
 

J'ai rien dit ... Je suis vraiment trop con ... j'étais persuadé d'utiliser g++ et je viens juste de remarquer que j'utilisais gcc ... (effectivement avec g++ ça compile ...)
 
Merci les gars pour l'aide et désolé pour le dérangement ...

mood
Publicité
Posté le 20-02-2006 à 14:39:30  profilanswer
 

n°1310028
++fab
victime du syndrome IH
Posté le 20-02-2006 à 20:49:02  profilanswer
 

FrozenPaladin a écrit :

Code :
  1. TestC* c = new TestC;


Parce que les parentheses signifient ici l'appel explicite au contructeur TestC(void) qui n'existe pas ainsi que TestB(void) et TestA(void)


Pas du tout. La présence d'un new-initilizer "()" produit un effet visible lorsque le type auquel le new-initilizer se rapporte est un POD.
 

n°1310985
Taz
bisounours-codeur
Posté le 21-02-2006 à 20:45:42  profilanswer
 

le code que tu nous montre n'est pas celui compilé. d'ou sors ce delete ?

n°1310991
skelter
Posté le 21-02-2006 à 20:54:57  profilanswer
 

Olivier51 a écrit :

J'ai rien dit ... Je suis vraiment trop con ... j'étais persuadé d'utiliser g++ et je viens juste de remarquer que j'utilisais gcc


 
pourtant tu montres des erreurs à l'édition des liens alors qu'avec gcc ca ne compilerait meme pas, ca bloquerait sur des 'parse error' ??


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [Résolu] Problème d'héritage d'héritage + redéfinition de méthode

 

Sujets relatifs
[Résolu][BDE C++ Builder 6 TTable] Impossible d'activer une TTable[Pas tout à fait résolu] Pb de positionnement de div en design fluide
problème connection VB6 vers MSSQL par ODBC W2003 SERVEURproblème connection VB6 vers MSSQL par ODBC W2003 SERVEUR
probléme programmation ASprobleme validation dtd
[Résolu] Upload de fichiers sur Online.net[Perl] Identification problème de Parse UTF-8
[Résolu] Les <ul> imbriqués, c'est pas W3C compliant ?Probleme avec <a name=""> / ancre
Plus de sujets relatifs à : [Résolu] Problème d'héritage d'héritage + redéfinition de méthode


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR