Ein paar Theoriefragen



  • krümelkacker schrieb:

    Haimi schrieb:

    1. Die späte Bindung einer Funktion ist Laufzeit-effizienter als die frühe Bindung.
      Falsch

    👍 Sicherlich will der Prüfer hier ein "Falsch" sehen, obwohl der Unterschied wahrscheinlich kaum spürbar sein sollte.

    Müsste das nicht gleich schnell sein (was ja heißt: "nicht effizienter")? Späte Bindung ist doch, wenn man gegen eine DLL linkt, richtig?

    krümelkacker schrieb:

    Haimi schrieb:

    1. Weist man einer Variablen vom Typ der Unterklasse einen Wert vom Typ einer Oberklasse dieser Unterklasse zu, so ist dies nur mit expliziter Konversion möglich.
      Falsch

    kommt drauf an, was der Prüfer genau mit "expliziter Konversion" meinst.

    Einen static_cast oder so wahrscheinlich..?



  • Zum Thema Sichtbarkeit lässt sich H.Sutter in einem der Exceptional Büchern aus (glaube Excepional Style). Den entsprechenden gotw finde ich grad nicht. Auf jeden Fall sind auch private Methoden sichtbar, merkt man z.B. bei der Überladungsauflösung. Man kann nur den Namen eines privaten Symbols nicht verwenden, sehen kann man es.
    Allerdings wird der Begriff Sichtbarkeit sehr häufig im Zusammenhang mit Zugriffskontrolle verwendet, darum weiß ich auch nicht ob ich da 'Ja' ankreuzen würde.
    Man könnte auch noch darüber diskutieren, was denn überhaupt eine Funktion einer Basisklasse ist (What's in a class). Funktionen, die gar nicht im header deklariert sind, sind dann tatsächlich nicht sichtbar, zumindest nicht bis zum Linken.



  • Vielleicht ist mit Sichtbarkeit das gemeint:

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct A
    {
      void f( string x ) {}
    };
    
    struct B : A
    {
      void f( int x ) {}
      void g() { f( "aa" ); }
    };
    
    int main()
    {
      B aB;
      aB.g();
    }
    

    f mit Parameter std::string ist in g nicht sichtbar => Fehler
    Mit using A::f funktioniert es dann.



  • krümelkacker schrieb:

    Haimi schrieb:

    1. Die späte Bindung einer Funktion ist Laufzeit-effizienter als die frühe Bindung.
      Falsch

    👍 Sicherlich will der Prüfer hier ein "Falsch" sehen, obwohl der Unterschied wahrscheinlich kaum spürbar sein sollte.

    Na 100%ig will er hier "Falsch" sehen. Selbst wenn es überhaupt keinen Unterschied gäbe, wäre die Behauptung falsch.



  • ichduersiees schrieb:

    krümelkacker schrieb:

    Haimi schrieb:

    1. Die späte Bindung einer Funktion ist Laufzeit-effizienter als die frühe Bindung.
      Falsch

    👍 Sicherlich will der Prüfer hier ein "Falsch" sehen, obwohl der Unterschied wahrscheinlich kaum spürbar sein sollte.

    Müsste das nicht gleich schnell sein (was ja heißt: "nicht effizienter")? Späte Bindung ist doch, wenn man gegen eine DLL linkt, richtig?

    "Späte Bindung" (late binding) ist ein OOP-Begriff und bezieht sich im Falle von C++ auf virtuelle Funktionen.

    ichduersiees schrieb:

    krümelkacker schrieb:

    Haimi schrieb:

    1. Weist man einer Variablen vom Typ der Unterklasse einen Wert vom Typ einer Oberklasse dieser Unterklasse zu, so ist dies nur mit expliziter Konversion möglich.
      Falsch

    kommt drauf an, was der Prüfer genau mit "expliziter Konversion" meint.

    Einen static_cast oder so wahrscheinlich..?

    Ja wie denn?

    class Oberklasse
    {
      int i;
    public:
      Oberklasse() : i(0) {}
    };
    
    class Unterklasse : public Oberklasse
    {
      int j;
    public:
      Unterklasse() : j(0) {}
    };
    
    ...
    
    Unterklasse d;
    Oberklasse s;
    d = s;                            // kompiliert nicht
    d = static_cast<Unterklasse>(s);  // kompiliert nicht
    d = static_cast<Unterklasse&>(s); // kompiliert, aber undefiniertes Verhalten
    static_cast<Oberklasse&>(d) = s;  // kompiliert, alles OK
    


  • krümelkacker schrieb:

    [...]

    Die Unterklasse könnte auch einen Konvertierungs-Ctor/Zuweisungs-Operator haben, welcher ein Objekt der Oberklasse annimmt. Ob man (der Prof.) dass dann als explizit oder implizit betrachtet, weiß ich nicht.



  • krümelkacker schrieb:

    "Späte Bindung" (late binding) ist ein OOP-Begriff und bezieht sich im Falle von C++ auf virtuelle Funktionen.

    hm..?

    http://en.wikipedia.org/wiki/Late_binding schrieb:

    Late binding is often confused with dynamic dispatch, but there are significant differences. With early binding the compiler statically verifies that there are one or more methods with the appropriate method name and signature. This is usually stored in the compiled program as an offer in a virtual method table and is very efficient. With late binding the compiler doesn’t have enough information to verify the method even exists, let along bind to its particular slot on the v-table. Instead the method is looked up by name at runtime.



  • > Late binding is often confused with dynamic dispatch [...] Instead the method is looked up by name at runtime.

    Aha. Die Definition kannte ich nicht. Danke Dir für den Hinweis!

    Dann macht die Frage in der Klausur natürlich noch weniger Sinn, zumindest wenn sie sich auf C++ bezieht.



  • "Definition"? Das ist nur Wikipedia. Late Binding benutzt der eine so und der andere so, ich würd das nicht so eng sehen.



  • hmmmmmmmm schrieb:

    krümelkacker schrieb:

    "Späte Bindung" (late binding) ist ein OOP-Begriff und bezieht sich im Falle von C++ auf virtuelle Funktionen.

    hm..?

    Wikipedia stellt die allgemeinen Begriffserklärung, nicht aber die Interpretation in bestimmten Kontexten dar. Da C++ vom Standard her keine DLLs kennt (geschweige den das DLLs irgendwie standardisiert wären), wird man den Begriff hier wohl kaum auf eben diese anwenden.


Anmelden zum Antworten