Virtual sinnhaft?



  • Was ist eigentlich hier genau mit "Klassen zu Laufzeit laden" gemeint?

    Eine Instanz per 'new' auf dem Heap anlegen.



  • mikey schrieb:

    Was ist eigentlich hier genau mit "Klassen zu Laufzeit laden" gemeint?

    Eine Instanz per 'new' auf dem Heap anlegen.

    öhm dann würde mich mal interessieren, wieso das in C++ ncht geht soll^^ - hab ich was verpasst?
    Wobei eine Instanz aufm Heap ablegen, würde ich eher als Objekt zur Laufzeit laden bezeichnen ... Klassen zur Laufzeit laden hieße meinem Gefühl nach, dass man die Klassendefinition zur Laufzeit kennt -> wie ein Vorredner schon angesprochen hat, über DLLs machbar.



  • audacia schrieb:

    In vielen Fällen weiß es nicht der Compiler, sondern frühestens der Linker. Und solange der ein C-Linker bleibt, hat er keinen Eingriff in den Compiliervorgang.

    Also ne moderne IDE kann doch anzeigen, ob es mehrere gleiche methoden gibt, wenn ich von nem Aufruf zur Definition springen will. So schwer kann das nicht sein.

    Und außerdem gibts DLLs, mit denen sowas wie "Klassen zur Laufzeit laden" praktikabel ist 😉

    Da muss aber vorher die Deklaration bekannt sein, oder?

    mikey schrieb:

    Was ist eigentlich hier genau mit "Klassen zu Laufzeit laden" gemeint?

    Eine Instanz per 'new' auf dem Heap anlegen.

    Nein. 🙄 Sowas wie in Java Class.forName und Methodennamen per Reflection ermitteln und das ganz Zeug.



  • www.de schrieb:

    Also ne moderne IDE kann doch anzeigen, ob es mehrere gleiche methoden gibt, wenn ich von nem Aufruf zur Definition springen will. So schwer kann das nicht sein.
    ...
    Da muss aber vorher die Deklaration bekannt sein, oder?

    Ich sehe schon, du bedarfst eines Beispiels.

    // mylib.hpp
    
    struct MyNotPolymorphicClass
    {
        void doSomething (void) {}
    };
    
    // mydll.hpp
    
    #ifdef DLL
     #define EXPORT __declspec (dllexport)
    #else
     #define EXPORT __declspec (dllimport)
    #endif
    
    #include "mylib.hpp"
    
    EXPORT void doSomethingWithObject (MyNotPolymorphicClass& obj);
    
    // mydemoproject.cpp
    
    #include "mylib.hpp"
    #include "mydll.hpp"
    
    int main (void)
    {
        MyNotPolymorphicClass mnpc;
        doSomethingWithObject (mnpc); // hier wirds interessant
    }
    
    // mydll.cpp
    
    #include "mydll.hpp"
    #include <windows.h>
    
    struct MyNotPolymorphicButStupidlyDerivedClass : MyNotPolymorphicClass
    {
        void doSomething (void) {}
    };
    
    EXPORT void doSomethingWithObject (MyNotPolymorphicClass& obj)
    {
        obj.doSomething ();
    }
    

    Angenommen, ein Compiler ginge aus von dem, was er sieht, und deklarierte dementsprechend Funktionen virtuell. Wenn du mydemoproject.cpp kompilierst, sieht dein hypothetischer Compiler die Definition von MyNotPolymorphicClass, aber keine abgeleitete Klasse, implementiert die Funktion folglich nicht virtuell. Kompilierst du die DLL, so sieht er Basisklasse und Derivat und implementiert die Funktion virtuell. Beide kommen erst zur Laufzeit zusammen.

    Was im Beispiel passieren würde, ist offensichtlich: in der main()-Funktion wird auf dem Stack ein Objekt einer nicht polymorphen Klasse erstellt und an die DLL-Funktion doSomethingWithObject() übergeben. Diese ist innerhalb der DLL implementiert, wo der Compiler aufgrund des Vorhandenseins einer abgeleiteten Klasse die Funktion als virtuell ansieht und über die V-Table aufruft. Das übergebene Objekt hat aber gar keine V-Table - das Programm erzeugt eine fatale AV und stürzt ab.

    An die Kritiker: natürlich hätte man das auch einfach anhand zweier verschiedener Objektdateien demonstrieren können. So jedoch entsteht gar nicht erst die Diskussion, ob der Linker so eine Aufgabe nicht übernehmen könne.



  • mikey schrieb:

    Was ist eigentlich hier genau mit "Klassen zu Laufzeit laden" gemeint?

    Eine Instanz per 'new' auf dem Heap anlegen.

    😃



  • mikey schrieb:

    Was ist eigentlich hier genau mit "Klassen zu Laufzeit laden" gemeint?

    Eine Instanz per 'new' auf dem Heap anlegen.

    nee, mehr so wie dcom, corba, (und Java, siehe www.de) und sowas das machen, also interfaces dynamisch laden und dann objekte davon instanziieren. in C++ sind klassen ja statisch d.h. auf dem 'C++ compile time level' geht sowas nicht...
    🙂


Anmelden zum Antworten