Ändern Sie rein virtuell in virtuell und binär kompatibel bleiben

8

Kann ich eine rein virtuelle Funktion (in einer Basisklasse) so ändern, dass sie nicht rein wird, ohne dass Probleme mit der Binärkompatibilität auftreten? (Linux, GCC 4.1)

Danke

    
mr grumpy 19.07.2011, 14:33
quelle

2 Antworten

3

Was bedeutet es, binäre Kompatibilität für Sie aufrechtzuerhalten?

Das Objektlayout ist das gleiche, aber Sie werden die One Definition Rule brechen, es sei denn Sie kompilieren den gesamten Code neu, wobei binäre Kompatibilität im Grunde nutzlos ist. Ohne das erneute Kompilieren ist das ODR defekt, und obwohl es möglicherweise funktioniert, funktioniert es möglicherweise auch nicht.

Insbesondere wenn alle virtuellen Methoden in der Klasse entweder rein oder inline definiert sind, generiert der Compiler möglicherweise die vtable in jeder Übersetzungseinheit, die den Header enthält, und markiert sie als ein schwaches Symbol. Dann wird der Linker einen von ihnen auswählen und alle anderen verwerfen. In dieser Situation muss der Linker nicht verifizieren, dass alle VTabellen exakt gleich sind, und er wird einen zufällig auswählen (oder deterministisch auf eine undefinierte Weise), und er kann eine solche VTable auswählen, bei der die Methode rein virtuell ist Turn könnte die Anwendung zum Absturz bringen, wenn die Methode für ein Objekt der Basisklasse aufgerufen wird.

    
David Rodríguez - dribeas 19.07.2011, 16:31
quelle
4

Es gibt keine Kompatibilitätsprobleme , wenn Sie von reinem virtual zu virtual wechseln und dann den Code erneut kompilieren. (% Co_de% bis pure virtual kann jedoch Probleme verursachen.)

Sie sollten nur darauf achten, dass die nicht-reinen virtual Methoden einen Körper haben müssen. Sie können nicht unimplementiert bleiben. d. h.

%Vor%

Sie können nicht einfach sagen,

%Vor%

Es wird Linker-Fehler verursachen, auch wenn Sie es nicht verwenden.

    
iammilind 19.07.2011 14:36
quelle