pure virtual???

Gast #555894
Hallo,

ich hab mal wieder versucht, objektorientiert zu proggen. Leider klappt 
es nicht so wie es sollte. Beim folgendem Code bekomme ich 'ne 
Fehlermeldung:
1
class a
2
{
3
  public:
4
  virtual void mach()=0;
5
};
6

7
class b:public a
8
{
9
  public:
10
  void mach()
11
  {
12
  }
13
};
14

15
int main()
16
{
17
  b x;
18
  x.mach();
19
}
Und hier das Output vom Compiler:
1
> "make.exe" all
2

3
-------- begin --------
4
avr-gcc (GCC) 3.4.6
5
Copyright (C) 2006 Free Software Foundation, Inc.
6
This is free software; see the source for copying conditions.  There is NO
7
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8

9

10
Compiling C++: main.cpp
11
avr-gcc -c -mmcu=atmega32 -I. -x c++ -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -fno-exceptions -Wall -Wa,-adhlns=obj/main.lst  -MD -MP -MF .dep/main.o.d main.cpp -o obj/main.o 
12
main.cpp:37: warning: alignment of 'b::_ZTV1b' is greater than maximum object file alignment.  Using 1
13
main.cpp:31: warning: alignment of 'a::_ZTV1a' is greater than maximum object file alignment.  Using 1
14

15
Linking: testpp.elf
16
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.o  -std=gnu99 -Wundef -MD -MP -MF .dep/testpp.elf.d obj/main.o --output testpp.elf -Wl,-Map=testpp.map,--cref    -lm
17
obj/main.o:(.data+0xa): undefined reference to `__cxa_pure_virtual'
18
make.exe: *** [testpp.elf] Error 1
19

20
> Process Exit Code: 2
21
> Time Taken: 00:00[/code]
Weiss jemand, was diesmal nicht klappt???

MfG Mark
Vom C++ her ist dein Code korrekt, ich würde darauf tippen, dass der 
std-lib vom AVR-G++ die Unterstützung für pure virtual funktionen fehlt 
(die er bei fn =0 einbindet, und die normalerweise eine assertion 
auslöst)
Deswegen der Linker-Fehler bei __cxa_pure_virtual.

Die anderen Fehler würd ich so deuten, das auch normale Virtuelle 
Funktionen nicht gehen. (Position in der VMT > max. position)

/Ernst
Persönliche Seite
Ich sehe nirgends in der Kommandozeile, dass die libstdc++.(a,so) beim 
Linken benutzt wird.

In dieser Library steckt üblicherweise und laut Google-Suche das Symbol 
`__cxa_pure_virtual'.

Kann es sein, dass du ein unpassendes Makefile hast (vielleicht nur für 
C Projekte)?

Möglicherweise (wahrscheinlicherweise) gibt es auch keine Library 
libstdc++.(a,so) für die AVR Targets!
Gast
Die alignment-Warnung ist harmlos. Die resultiert aus einem kleinen Bug 
im AVR-Target von GCC. Da wird aber trotzdem das richtige getan und die 
Warnung kann getrost ignoriert werden.
__cxa_pure_virtual ist die Funktion, die aufgerufen wird, wenn es durch 
einen Fehler im Programm zu einem Aufruf einer rein virtuellen Funktion 
käme. Da es keine C++-Standardlib für AVR-g++ gibt (und auch keine 
libsupc++), fehlt die Implmenentation dieser Funktion. Es sollte 
allerdings möglich sein, das zu korrigieren, indem man die Funktion 
einfach selbst schreibt. Sie kann dazu einfach leer sein oder auch eine 
Debug-Ausgabe irgendwo hinschreiben. Probier einfach mal ein:
1
void __cxa_pure_virtual()
2
{
3
}

ggf. noch mit einem extern "C" davor, falls er's immer noch nicht 
findet.
Gast
hallo,
der von rolf vorgschlagene workaround funktioniert bei mir ohne 
probleme.
1
/*!
2
 * \brief Pure-virtual workaround.
3
 *
4
 * The avr-libc does not support a default implementation for handling 
5
 * possible pure-virtual calls. This is a short and empty workaround for this.
6
 */
7
extern "C" {
8
  void __cxa_pure_virtual()
9
  {
10
    // put error handling here
11
  }
12
}

bye kosmo
Gast
>class a
>{
>  public:
>  virtual void mach()=0;
>};

>class b:public a
>{
>  public:
>  void mach()
>  {
>  }
>};

>int main()
>{
>  b x;
>  x.mach();
>}

Wenn du virtuelle Methoden definierst, dann  sollten sie auch in den 
abgeleiteten Klassen virtuell sein - das geschieht zwar automatisch, 
aber du selbst oder Fremde werden beim Anblick deiner abgeleiteten 
Klasse keine Ahnung davon haben.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.