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

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

Marsh Posté le 20-02-2006 à 12:46:56    

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
Reply

Marsh Posté le 20-02-2006 à 12:46:56   

Reply

Marsh Posté le 20-02-2006 à 13:18:14    

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.

Reply

Marsh Posté le 20-02-2006 à 13:36:17    

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

Reply

Marsh Posté le 20-02-2006 à 13:38:13    

mets un destructeur virtuel

Reply

Marsh Posté le 20-02-2006 à 13:40:01    

[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

Reply

Marsh Posté le 20-02-2006 à 14:02:21    

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
Reply

Marsh Posté le 20-02-2006 à 14:09:44    

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

Reply

Marsh Posté le 20-02-2006 à 14:12:01    

bah g++ 4 aussi.

Reply

Marsh Posté le 20-02-2006 à 14:37:55    

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

Reply

Marsh Posté le 20-02-2006 à 14:39:30    

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 ...

Reply

Marsh Posté le 20-02-2006 à 14:39:30   

Reply

Marsh Posté le 20-02-2006 à 20:49:02    

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.
 

Reply

Marsh Posté le 21-02-2006 à 20:45:42    

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

Reply

Marsh Posté le 21-02-2006 à 20:54:57    

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' ??

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed