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?
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, main
wenn 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.
Lass mich ein paar Worte sagen