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.
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.
Sie können nicht einfach sagen,
%Vor%Es wird Linker-Fehler verursachen, auch wenn Sie es nicht verwenden.
Tags und Links c++ pure-virtual binary-compatibility