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 mitcruiser* 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?
-
@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 voncruiser
ableitest?class
erbt per Defaultprivate
. 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
undfetterporsche
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 Funktionmain
verlassen wird. Der Compiler fügt da implizit Code ein, der den Destruktor aufruft und den Speicher (hier auf dem Stack) wieder freigibt.
-
-
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?
-
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)
-
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?
-
dass man eigentlich nur bei .net verwendet
Keine Ahnung. Oben steht C++ (alle ISO-Standards)
-
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
undvoid
sind in C++ Keywords,Public
undVoid
nicht.
Ebenso gibt es kein KeywordAbstract
. Aber in dem Fall ist auch die klein geschriebene Varianteabstract
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?