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:
-O2
class Foo: public A, public B {}
zu class Foo: public B, public A {}
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?
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.