"Fehlende nicht virtuelle Thunks" und Vererbungsreihenfolge

8

Wir haben eine große Codebasis in C ++ und nach einem kleinen Refactor (eine Klasse hinzugefügt und einige verwandte Methoden neu geschrieben), begannen wir Linker Fehler auf GCC 3 & amp; 4. Die Linker-Fehler enthielten speziell "fehlende Verweise auf nicht virtuelle Thunks" in kleinen Beispielprogrammen, die Klassen in unserem großen SDK unterklassierten.

Die Suche im Web hat nicht viele Hinweise gegeben, die über einige alte GCC-Fehler hinausgehen, die scheinbar gelöst wurden.

Die Attribute des Problems scheinen zu sein:

  • GCC 3.4.6 & amp; 4.3.3 Optimierung mit -O2
  • Mehrfache Vererbung, einschließlich gelegentlicher virtueller Vererbung.
  • Ändern der Vererbungsreihenfolge von, sagen wir, class Foo: public A, public B {} zu
    class Foo: public B, public A {}
    In den Klassen, die fehlen, "behebt" das Problem das Problem.

Die virtuelle Vererbung wird nur in einer einzigen, sehr häufig verwendeten Basisklasse für die Referenzzählung angezeigt. Ich habe überprüft, dass jede Verwendung dieser Klasse wirklich virtuell öffentlich ist, und nicht nur die öffentliche Vererbung durch Zufall.

Offensichtlich ist das Problem mit der Erbrechtsordnung nicht gelöst. Was könnte es sonst sein?

    
Adrian 14.04.2011, 15:36
quelle

2 Antworten

1

Wenn das Ändern der Deklarationsreihenfolge der Basisklassen das Problem behebt, bedeutet dies wahrscheinlich, dass eine der Basisklassen nicht richtig definiert, was sie deklariert hat.

Wenn Sie z. B. eine Deklaration mit einer (nicht virtuellen) Methode Func in Klasse A und dieselbe in Klasse B haben, aber nie für Klasse A definiert haben, wird die Methode beim ersten Aufruf der Methode in Ihrem Kind aufgerufen Die Version von Klasse A wird aufgerufen, aber bei der Verknüpfungszeit wird die Referenz nicht gefunden. Wenn Sie die Vererbungsreihenfolge ändern, wird der Compiler stattdessen B :: Func aufrufen, was definiert ist und dann der Linker findet.

IMHO, es ist sowieso ein schlechtes Design, da Verhalten schwer vorherzusagen und zu debuggen ist.

    
xryl669 29.10.2012 11:42
quelle
0

Es könnte das Diamantenproblem

sein

Wenn ja, prüfen Sie Dieser Thread

    
DjSol 16.10.2012 13:27
quelle

Tags und Links