Schlüsselwort virtual;



  • Hallo,
    Ich hab ne kurze frage. Was bringt der Schlüsselwort virtual?
    Ich hab vieles drüber gelesen mein Hirn wills aber irgendwie
    nicht verstehen.

    Danke
    Grüsse !



  • #include <iostream>
    
    struct OhneVirtualBase
    {
        void print()
        {
            std::cout << "OhneVirtualBase";
        }
    };
    
    struct OhneVirtualDerived : public OhneVirtualBase
    {
        void print()
        {
            std::cout << "OhneVirtualDerived";
        }
    };
    
    struct MitVirtualBase
    {
        virtual void print()
        {
            std::cout << "MitVirtualBase";
        }
    };
    
    struct MitVirtualDerived  : public MitVirtualBase
    {
        virtual void print()
        {
            std::cout << "MitVirtualDerived";
        }
    };
    
    int main()
    {
        OhneVirtualBase* base1 = new OhneVirtualDerived;
        base1->print(); // Huch, wieso meldet sich Base? Haben wir doch überschrieben.
    
        MitVirtualBase* base2 = new MitVirtualDerived;
        base2->print(); // Wie erwartet MitVirtualDerived
    }
    

  • Mod

    Was können wir anderes schreiben als das was in Büchern steht? Was genau verstehst du nicht? Fehlen dir Hintergrundkenntnisse zum Verständnis?



  • "Mit virtual an einer Methodendeklaration wird der Rechner beauftragt, beim Aufruf diese Methode nicht unmittelbar anzuspringen, sondern zunächst jedesmal das konkrete Objekt zu befragen, welche Methode denn nun wirklich zu benutzen sei."

    Was meint er z.B hier mit anzuspringen

    Quelle :
    http://frag.wikia.com/wiki/Was_bedeutet_das_Schlüsselwort_virtual_in_der_Programmiersprache_C%2B%2B



  • @ethon hm... in deinem Code hast du eine entscheidende Kleinigkeit vergessen: die Vererbung 😉



  • daddy_felix schrieb:

    @ethon hm... in deinem Code hast du eine entscheidende Kleinigkeit vergessen: die Vererbung 😉

    Danke 😉

    "Mit virtual an einer Methodendeklaration wird der Rechner beauftragt, beim Aufruf diese Methode nicht unmittelbar anzuspringen, sondern zunächst jedesmal das konkrete Objekt zu befragen, welche Methode denn nun wirklich zu benutzen sei."

    Was meint er z.B hier mit anzuspringen

    Quelle :
    http://frag.wikia.com/wiki/Was_bedeutet_das_Schlüsselwort_virtual_in_der_Programmiersprache_C%2B%2B

    Meinen Code mal ausprobiert? Nichts über das du dich wunderst?



  • Ja ausprobiert hab ichs ,dass hab ich aber auch erst gemerkt
    als er es gesagt hat.



  • Ja also bei nicht virtual wirds nicht überschrieben.



  • Das ist eine sehr formale Definition, die ich einem Anfänger so üblicherweise nicht geben würde. Es bedeutet einfach, dass beim Aufruf einer Methode über eine Referenz/einen Zeiger auf die Basisklasse der Typ betrachtet wird, den das Objekt in Wirklichkeit hat.

    Kleines Beispiel:

    struct base
    {
        void foo() { std::cout << "base::foo\n"; }
        virtual void bar() { std::cout << "base::bar\n"; }
    };
    
    struct derived
    {
        void foo() { std::cout << "derived::foo\n"; }
        void bar() { std::cout << "derived::bar\n"; }
    };
    
    int main()
    {
        derived d;
        base& b = d;
    
        // Ganz normal wie erwartet
        d.foo(); // Ausgabe: derived::foo
        d.bar(); // Ausgabe: derived::bar
    
        b.foo(); // Ausgabe: base::foo
        b.bar(); // Aha! Ausgabe: derived::bar
    }
    


  • Ja also bei nicht virtual wirds nicht überschrieben.



  • Aso damit kann ich dann einen Object auf die Methoden eines anderen Objectes zugreifen lassen. Wenn natürlich die Methode dann virtual ist



  • Cho++ schrieb:

    Aso damit kann ich dann einen Object auf die Methoden eines anderen Objectes zugreifen lassen. Wenn natürlich die Methode dann virtual ist

    Kann mal einer übersetzen 😕

    - Hat eine Klasse min. eine virtual function , verhält sie sich polymorph.
    - Eine non-virtual function kann nicht überschrieben, sondern nur verdeckt werden.
    - Hat eine Klasse min. eine pure virtual function , nennt sie sich abstrakte Basisklasse.



  • Gugelmoser schrieb:

    abstrakte Klasse.

    Sag: abstrakte Basisklasse. Denn wenn du schon keine Instanzen erstellen kannst, willst du ja ableiten, oder etwa nicht?

    P.S.: Seit C++11 gibt es noch das schöne Schlüsselwörtchen final . Google das mal.

    Edit: Ach, und nochwas:

    #include <iostream>
    
    struct base
    {
        virtual void bar() { std::cout << "base::bar\n"; }
    };
    
    struct derived : public base
    {
        void bar() { std::cout << "derived::bar\n"; }
    };
    
    int main()
    {
        derived d;
        base& binst = d;
    
        binst.bar();
        binst.base::bar();
    }
    


  • Hacker schrieb:

    Gugelmoser schrieb:

    Sag: abstrakte Basisklasse. Denn wenn du schon keine Instanzen erstellen kannst, willst du ja ableiten, oder etwa nicht?

    Stimmt. Es war auch mal davon die Rede (ich glaube pumuckl wars), dass abstrakte Klassen ausschließlich als Basisklassen vorkommen sollten.



  • Wo ist final?

    [quote:923f93410a="Working Draft, Standard for Programming
    Language C++ / N3242=11-0012 / Page 24 "]alignas continue friend register true
    alignof decltype goto reinterpret_cast try
    asm default if return typedef
    auto delete inline short typeid
    bool double int signed typename
    break do long sizeof union
    case dynamic_cast mutable static unsigned
    catch else namespace static_assert using
    char enum new static_cast virtual
    char16_t explicit noexcept struct void
    char32_t export nullptr switch volatile
    class extern operator template wchar_t
    const false private this while
    constexpr float protected thread_local
    const_cast for public throw



  • Zeus schrieb:

    Wo ist final?

    Wikipedia schrieb:

    Note that neither override nor final are language keywords. They are technically identifiers; they gain special meaning only when used in those specific contexts. In any other location, they can be valid identifiers.


  • Mod

    Zeus schrieb:

    Wo ist final?

    Da hat er sogar Recht, Kapitel 10.3



  • Ahh, tut mir Leid. Jedenfalls kann man sie benutzen.



  • SeppJ schrieb:

    Zeus schrieb:

    Wo ist final?

    Da hat er sogar Recht, Kapitel 10.3

    Seltsam im ersten Augenblick - aber ich seh doch richtig, dass das final nur in Bezug auf die Funktion spezifiziert werden kann und nicht auf die Klasse?


  • Mod

    Zeus schrieb:

    Seltsam im ersten Augenblick - aber ich seh doch richtig, dass das final nur in Bezug auf die Funktion spezifiziert werden kann und nicht auf die Klasse?

    Ja.


Anmelden zum Antworten