verständnissprobleme bei Klassenvererbung und virtuellen Funktionen [Gelöst]



  • Liebe Leser

    Ich habe ein paar Verständnissprobleme bezüglich Funktionsüberschreibung bei einer Klassenvererbung.
    Dabei wird in meinem Buch beschreiben, was virtuelle Funktionen bezwecken. Dazu folgendes beispiel

    #include <iostream>
    
    using namespace std;
    
    // Oberklasse
    class OBERKLASSE
    {
    public:
    
    	virtual void DoSth()
    	{
    		cout << "OBERKLASSE::DoSth()";
    	}
    
    };
    
    // Unterklasse
    class UNTERKLASSE : public OBERKLASSE
    {
    public:
    	virtual void DoSth()
    	{
    		cout << "UNTERKLASSE ::DoSth";
    	}
    };
    
    int main()
    {
    	OBERKLASSE        ObjA;  // Oberklasseobjekt
    	UNTERKLASSE       ObjB;  // Unterklasseobjekt
    
    	OBERKLASSE        *Ptr;   // Zeiger vom Typ Oberklasse
    
    	// Zeiger auf ObjA (Oberklasse) richten
    	Ptr = &ObjA;
    	Ptr->DoSth(); // OBERKLASSE::DoSth() wurde aufgerufen
    
    	// Zeiger auf ObjB (Unterklasse) richten
    	Ptr = &ObjB;
    	Ptr->DoSth(); // UNTERKLASSE::DoSth() wurde aufgerufen
    
    	return 0;
    }
    

    Man kann ja einen Zeiger vom Typ Oberklasse auf eine Objekt des Typs Unterklasse verweisen lassen.
    Dabei wird der Subtyp, der in Unterklasse enthalten ist beachtet, und der ander Teil von Unterklasse wird verworfe,
    weil dafür kein Platz ist. Im zweiten fall wird die überschriebene Funktion aufgerufen, obwohl der Zeiger
    vom Typ Oberklasse ist.

    Nun zu meiner Frage. Was bewirken diese virtuellen Funktionen? Ich weis nur, das dann in jedem Objekt ein
    zusätzlicher Zeiger existiert, der auf eine (virtual table) verweist. (Tabelle mit Zeigern auf
    virtuelle Funktionen). Was haben virtuelle Funktionen mit einer Klassenvererbung zu tun? Ich habe mir
    die betreffenden Seiten schon so oft durchgelesen, das die Seiten schon herausfallen, was bei meinem
    C++ Buch leider normal ist.

    Ich hoffe, dass mir einer helfen kann.

    Vielen dank im voraus.



  • Sebastian Müller schrieb:

    Ich habe den Code freihand gerschrieben. kann sein, das ein paar Syntaxfehler drinnen sind.

    Aha, von uns erwartest du also eine Antwort, bist aber selber zu faul, dir die fünf Minuten Zeit zu nehmen, um den Code lauffähig zu machen.

    und der ander Teil von Unterklasse wird verworfe,
    weil dafür kein Platz ist

    Das ist Blödsin, hier wird nichts verworfen.

    Nun zu meiner Frage. Was bewirken diese virtuellen Funktionen?

    Dass die Funktionen der abgeleiteten Klasse aufgerufen werden.

    Ich weis nur, das dann in jedem Objekt ein
    zusätzlicher Zeiger existiert, der auf eine (virtual table) verweist. (Tabelle mit Zeigern auf
    virtuelle Funktionen).

    Das ist zwar meistens so, ist aber ein Implementierungsdetail. Der Standard sagt nichts dazu.

    Was haben virtuelle Funktionen mit einer Klassenvererbung zu tun?

    Der Frage kann ich keinen Sinn entnehmen.



  • Danke für deine Antwort.
    Kann ich das so verstehen, dass die Oberklasse weiß, dass die in ihr enthaltene Funktion überschrieben ist?



  • Wäre es möglich, die das Wort "Verständniss" (und alle Abstammungen davon) wie "Standart" zu zensieren?
    Also Verständnissproblem -> verständ***problem



  • Sebastian Müller schrieb:

    Kann ich das so verstehen, dass die Oberklasse weiß, dass die in ihr enthaltene Funktion überschrieben ist?

    Zur Laufzeit existieren keine Klassen. In jeder Objekinstanz ist für virtuelle Funktionen (oft über die erwähnte vtable) festgelegt, welche konkrete Funktion zu nutzen ist.



  • Sorry. Ich habe mich falsch ausgedrückt. Eigendlich meine ich ja Objekte.
    Klassen definieren ja nur die Eigenschaften eines Objektes. Man kann sie als
    Bauanleitung verstehen.


  • Mod

    verständnisssss schrieb:

    Wäre es möglich, die das Wort "Verständniss" (und alle Abstammungen davon) wie "Standart" zu zensieren?
    Also Verständnissproblem -> verständ***problem

    Möglich ja, aber störend negativ ist es mir noch nicht aufgefallen. Jetzt, wo du mich drauf aufmerksam gemacht hast, werde ich mal verstärkt drauf achten.



  • Also ich denke, dass ich es jetzt verstanden habe.

    Ich habe mir folgenden Artikel mehrfach durchgelesen.
    http://www.willemer.de/informatik/cpp/cppvirt.htm

    Hier eine kleine Zusammenfassung.
    Der Einsatz von virtuellen Funktionen bezwecken, dass das Objekt die Verantwortung übernimmt, die richtige Funktion aufzurufen.
    Dabei kennt das Objekt die Klassenzugehörigkeit durch einen Zeiger auf die vtbl und ruft die Funtion über diese Tabelle (Array) auf.
    Wenn eine Klasse abgeleitet wird, erhält die neue Klasse eine Kopie der vtbl von der Oberklasse.
    Für alle überschriebenen Funktionen wird der Zeiger auf die eigenen Funktionen gesetzt.
    Deshalb wird auch die überschriebene Funktion nachher aufgerufen.

    Im obigen beispiel mit OBERKLASS und UNTERKLASSE hat das Objekt, auf das Ptr zeigt
    die korekten überladenen funktionen in der vtbl, obwohl der zeiger ja nur auf den
    Subtyp verweist. Das Objekt ruft über die Tabelle die richtige Funktion auf.

    Wenn es etwas zu korigieren gibt, wäre es sehr nett, mich darüber zu informieren.


Anmelden zum Antworten