Vereebung



  • Hi, wenn ich Klasse "A" und Klasse "B : public A" habe, dann sollte bei einer Methode die in beiden Klassen deklariert ist doch eigentlich immer die von der Basisklasse verwendet werden oder?
    Ob ich's so lasse, bei der Basisklasse virtual schreibe, oder virtual und bei der "B" Klasse Override Schreibe, es werden immer die Methoden der jeweiligen Klasse verwendet was gut ist, aber eigentlich nicht so sein sollte oder? Ich meine wozu dann überhaupt virtual und Override? Und wo wir Grad dabei sind, wozu virtual/Override anstatt nur virtual? Danke.

    #include <iostream>
    
    using namespace std;
    
    class cruiser {
    	
    	public:
    	
    	int geschwindigkeit;
    	int position;
    	
    	cruiser () {
    		cout << "Auto ohne Parameter wurde erstellt" << endl;
    		this->position = 0;
    	}
    	
    	cruiser (int geschwindigkeit) {
    		cout << "Auto wurde erstellt" << endl;
    		this->position = 0;
    	}
    	
    	~cruiser () {
    		cout << "Auto wurde vernichtet" << endl;
    	}
    	
    	 virtual void zeigeposition () {
    		cout << "Cruiserposition" << this->position << endl;
    	}
    	
    	private:
    	
    	void modgeschwindigkeit (int speed) {
    		this->geschwindigkeit += speed;
    	}	
    };
    
    class porsche : public cruiser {
    	
    	public:
    	
    	porsche () {
    		cout << "Porsche wurde erstellt" << endl;
    	}
    	
    	~porsche () {
    		cout << "Porsche wurde vernichtet" << endl;
    	}
    	
    	void zeigeposition  () override  {
    		cout << "Porscheposition" << this->position << endl;
    	}
    };
    
    int main () {
    	
    	cruiser* karre = new cruiser;
    	porsche* fetterporsche = new porsche;
    	
    	fetterporsche->zeigeposition();
    	karre->zeigeposition();
    
    


  • @ycbm
    Probiere mal alles aus mit

    cruiser* fetterporsche = new porsche;
    

    Fetterporsche ist also vom Typ cruiser*, aber du kannst dann trotzdem den Porsche zuweisen.



  • Da ich mich im Nachbarthread deutlich gegen jegliche Verwendung von new/delete ausgesprochen habe und damit man nicht den Eindruck bekommt, diese seien für virtuelle Vererbung irgendwie notwendig, werfe ich hier nochmal eben diese Variante hier in den Raum:

    int main () {
    
        cruiser karre;
        porsche fetterporsche;
        cruiser& fahrzeug = fetterporsche;
    	
        fetterporsche.zeigeposition();
        karre.zeigeposition();
        fahrzeug.zeigeposition();
    }
    

    Oder wenn man mag, auch mit Zeigern (haben den Vorteil, dass man diese im Programmverlauf auf andere Objekte, die von cruiser abgeleitet sind, "umbiegen" kann):

    cruiser* fahrzeug = &fetterporsche;
    fahrzeug->zeigeposition();
    fahrzeug = &karre;
    fahrzeug->zeigeposition();
    


  • @wob habe das auch gelesen aber der Test sagt was anderes "Cruiser ist an inaccessible base of Porsche"

    Ja lese auch nur schlechtes über new/delete aber wie löscht man denn wieder, einfach x = NULL?



  • @ycbm sagte in Vereebung:

    @wob habe das auch gelesen aber der Test sagt was anderes "Cruiser ist an inaccessible base of Porsche"

    Fehlt da eventuell ein public wenn du von cruiser ableitest? class erbt per Default private. Das muss so aussehen wie auch in deinem ersten Post:

    class porsche : public cruiser {
    

    Ja lese auch nur schlechtes über new/delete aber wie löscht man denn wieder, einfach x = NULL?

    Gar nicht, zumindest nicht explizit. karre und fetterporsche sind in meinem Beispiel oben sogenannte automatische Variablen, die zerstört werden, sobald der aktuelle Scope verlassen wird. Das passiert in Zeile 10 völlig automatisch, wo mit } der Scope der Funktion main verlassen wird. Der Compiler fügt da implizit Code ein, der den Destruktor aufruft und den Speicher (hier auf dem Stack) wieder freigibt.



  • @ycbm

    Cruiser ist an inaccessible base of Porsche

    Du zeigst nicht den echten Code.



  • Tatsache hab wohl rumprobiert und das Public nicht wieder reingeschrieben. Danke!

    Wollte noch was fragen bei der Ausgabe fällt mir auf, dass wohl immer wenn ein Erbendes Objekt erstellt wird, auch ein Objekt der vererben den Klasse erstellt wird. Wie wird das in professionellen Projekten gehandhabt ich meine das geht doch voll auf den Speicher. Wird dann aus dem Erbenden Objekt mit ach und Krach noch was gemacht oder einfach gelassen?



  • @ycbm sagte in Vereebung:

    auch ein Objekt der vererben den Klasse erstellt wird

    Nein! Es wird ein Objekt erzeugt. Wie kommst du darauf.



  • Der Code erstellt zwei Objekte aber die Ausgabe sagt
    Auto wurde erstellt
    Auto wurde erstellt
    Porsche..
    Also zwei Mal auto(cruiser)



  • @ycbm

    Porsche ist ein Auto und auch der Auto-Teil muss konstruiert werden.



  • @ycbm Ein Porsche ist ein Auto oder anders ausgedrückt, ein Porscheobjekt besteht aus einem Autoobjekt plus den Porscheteilen. Du solltest das noch mal in deinem Lernmaterial nachlesen.



  • @ycbm Du musst unterscheiden zwischen vollständigen "object" und einem "subobject".
    Wenn du einen Porsche baust, gibt es nur ein vollständiges "object", nämlich den Porsche. Und kein davon unabhängiges Auto.

    Ein integraler Bestandteil des Porsche ist aber ein "subobject" vom Typ Auto. Dieses ist in einem untrennbaren Verbund mit dem Porsche, der Porsche und das "in" ihm enthaltene Auto sind ein "object".



  • Ok eine noch. )

    Bei

    class bla Abstract {
    
    Public:
    
    Void bla () = 0 {}
    

    Wird die Klasse doch zwei mal unnötig Abstract gemacht oder?

    Einmal mit dem Wort Abstract (dass man eigentlich nur bei .net verwendet)
    Und einmal das = 0;

    Beide Sachen sorgen doch dafür, dass man kein Objekt dieser Klassen erstellen kann?



  • @ycbm sagte in Vereebung:

    dass man eigentlich nur bei .net verwendet

    Keine Ahnung. Oben steht C++ (alle ISO-Standards)



  • @ycbm sagte in Vereebung:

    Dein Code ist kein gültiges C++.

    class Porsche auto;

    wäre möglich, nur dass das dasselbe wäre wir Porsche auto;, also eine Variable vom Typ Porsche namens auto.

    Mit class bla Abstract { }; erzeugst (und initialisierst) du eine Variable "Abstract" vom Typ "bla".

    Public mit großem P und Void mit V sind auch keine C++-Schlüsselwörter. (Abstract, egal ob mit A oder a, auch nicht)



  • @ycbm Du musst das alles ein wenig genauer machen. public und void sind in C++ Keywords, Public und Void nicht.
    Ebenso gibt es kein Keyword Abstract. Aber in dem Fall ist auch die klein geschriebene Variante abstract kein Keyword.
    Weiters kann man eine "virtual pure" Funktion zwar durchaus implementieren, aber nicht innerhalb der Klassendefinition. Das muss, warum auch immer, ausserhalb der Klassendefinition passieren.

    D.h. dein Code ist voll von Fehlern und Quatsch.

    Woher sollen wir nun wissen was du meinst? Und wenn wir nicht wissen können was du meinst, wie sollen wir dann die Frage beantworten wieso man etwas in C++ angeblich macht was voll mit Fehler ist, also definitiv keiner machen kann?


Anmelden zum Antworten