Erweitern Sie aus der Bibliotheksklasse, wie die Methode für abgeleitete Klassen des Bibliotheksaufrufs verwendet wird

Harrison Vince

Ich frage mich, ob das möglich ist. Wieder ist das Problem:

Wie kann ich von einer Bibliotheksklasse aus erweitern und dann die Bibliothek eine Funktion innerhalb der abgeleiteten Klasse aufrufen lassen?

Offensichtlich wurde die Bibliothek bereits erstellt / kompiliert, bevor der Code geschrieben wurde, der die Vererbung verwendet (unten als DerivedClass dargestellt). Ich möchte mich so weit wie möglich vom Benutzer entfernen. Und um dies zu tun, habe ich das folgende Setup (einschließlich der Einfachheit halber weggelassen):

LibraryClass ist eine Klasse in einer von mir erstellten .lib.

LibraryClass.h
class LibraryClass{
public:
    virtual void MyMethod() { }
};

DerivedClass erbt von dieser Bibliothek:

DerivedClass.h
Class DerivedClass: public LibraryClass {
public:
    virtual void MyMethod();
};

Wenn ich MyMethod in der DerivedClass-Quelldatei wie folgt definiere:

DerivedClass.cpp
void DerivedClass::MyMethod() {
    cout << "it works!" << endl;
}

Gibt es eine Möglichkeit für die Bibliothek, die Methode der abgeleiteten Klasse aufzurufen? Ich dachte, ein DerivedClass-Objekt als Zeiger an die Bibliothek zu übergeben, aber die Bibliothek hat keinen Zugriff auf den Header, um es einzuschließen, da es bereits in die .lib kompiliert ist.

Ich habe das schon einmal gesehen (Urho3D), verwenden sie schwarze Magie oder fehlt mir etwas Einfaches?

Davis Herring

Dies ist genau das, was der dynamische Versand (in C ++ als bekannt virtual) tut: Wenn ein Base*(oder Base&) auf ein Objekt eines abgeleiteten Typs verweist, findet ein Aufruf einer virtuellen Funktion die Überschreibung auch ohne Deklaration von Derived(und damit auch dann, wenn die Aufruf wurde "zuerst kompiliert").

Was Ihre "von der Bibliothek bereitgestellte main" Idee betrifft, ist das viel schwieriger: Wie würde die Bibliothek im Allgemeinen wissen, wie Sie Ihr Objekt konstruieren , und was würde es tun, wenn Sie mit zwei "erweiterten Klassen" verknüpfen würden ?

Es ist jedoch möglich, wenn die Bibliothek dafür entwirft: Lassen Sie die Bibliothek eine globale Zeigervariable bereitstellen (die sie zuweist, mainwenn Sie einen Standard haben möchten), und lassen Sie den Konstruktor der Erweiterungsklasse ihr zuweisen this. Definieren Sie dann einfach ein globales Objekt dieses Klassentyps. Wenn Sie kein Standardverhalten benötigen, können Sie auch eine Initialisierungsfunktion in der Bibliothek deklarieren und aufrufen, aber nicht definieren, und sie der Erweiterung überlassen, um sie zu definieren.

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv