Kann man die virtuelle Schnittstelle ohne Neukompilierung des Client-Codes erweitern?

8

Eine Bibliothek stellt eine Klasse mit virtuellen Funktionen bereit. Kann diese Klasse mit neuen virtuellen Funktionen erweitert werden, ohne Binärdateien neu zu übersetzen, die dynamisch mit der Bibliothek verknüpft sind?

Ich glaube, das ist im Standard nicht möglich. Gibt es Plattformen, die das zulassen?

Wäre das einfacher, wenn neue Funktionen nur am Ende des Klassenkörpers hinzugefügt werden?

    
Basilevs 19.04.2011, 08:36
quelle

1 Antwort

5

Der Standard befasst sich nicht mit der Binärkompatibilität. Es betrifft jedoch Klassen, und indem Sie die Definition einer Klasse von einer Übersetzungseinheit in eine andere "ändern", rufen Sie tatsächlich undefiniertes Verhalten hervor.

Die meisten Compiler erlauben eine Reihe von Änderungen ohne die Notwendigkeit einer Neukompilierung, aber die Liste ist klein ... und für diese würde ich sagen, dass es möglicherweise nicht möglich ist, abhängig von der a priori Kenntnis der abgeleitete Klassen .

Das Problem, das ich vorhersehe, liegt in der Optimierung, die Compiler normalerweise an den virtuellen Tischen durchführen.

Wenn Sie eine Klasse mit virtuellen Funktionen erstellen, erhalten Sie eine virtuelle Tabelle, die so aussieht:

%Vor%

Um etwas Platz zu gewinnen, werden die virtuellen Funktionen der abgeleiteten Klasse normalerweise "angehängt":

%Vor%

Auf diese Weise hat ein D -Objekt nur einen virtuellen Zeiger, der als solcher verwendet werden kann, auch wenn der Typ (statisch) ein B ist (durch Zeiger oder Referenz).

Wenn Sie jedoch B erweitern, ohne D neu zu kompilieren, stürzt es einfach ab, denn beim Aufruf der Funktion N+1 von B würden Sie stattdessen die Funktion N+1 von% co_de aufrufen %, die wahrscheinlich nicht einmal die gleichen Argumente hätten ... oups!

Wenn Sie jedoch wissen, kann keine abgeleitete Klasse eine virtuelle Funktion hinzufügen.

    
Matthieu M. 19.04.2011, 08:52
quelle