Mehrere Fragen zur Objektorientierung
-
Hallo Freunde der Sonne, folgendes liegt mir auf dem Herzen:
1. Klassenvererbung:
Auto : public Fahrzeug
Warum muß man bei der Vererubung noch Spezifizierer wie "public" angeben, anstatt einfach z.B. "Auto : Fahrzeug" zu schreiben?2. Beispielsweise kann die Klasse Fahrzeug die Methode "daten_anzeigen()" enthalten, und Auto soll diese Funktion auch haben, wobei aber noch ein paar mehr Daten angezeigt werden sollen. Nun müßte man die neue Funktion allerdings überschreiben, gäbe es nicht die Möglichkeit die Funktion der vererbenden Klasse zuerst aufzurufen und dann die zusätzlichen Sachen, anstatt das Rad völlig neu zu erfinden?
3. In Java gibt es beispielsweise die Möglichkeit, bei der Klassendefinition folgendes zu schreiben:
class Auto
{
protected int hallo;protected void setHallo(int hallo)
{
this.hallo = hallo;
}
}Mir geht es um das Schlüsselwort this. Dieses funktioniert in C++ hier scheinbar anders al in Java. Gibt es in C++ eine ähnliche Möglichkeit sich so auszudrücken? Also so, daß ich einen Parameter genauso nennen kann wie eine Klassenvariable, ohne daß der C++-Kompilierer diese Variablen miteinander verwechselt?
Ich danke für alle liebevollen Antworten!
-
1. Weil es in C++ eben auch noch andere Arten der Vererbung gibt. Vom Konzept der Objektorientierung her haben diese eine ganz andere Bedeutung als die "ist ein"-Beziehung der public-Vererbung, also Vorsicht. Es dürfte relativ selten vorkommen, dass du diese anderen Modi brauchst, aber du solltest zur Kenntnis nehmen, dass es sie gibt und was sie bedeuten. Mehr erfährst du in guten Lehrbüchern.
2. Ruf doch einfach die geerbte Methode in der neuen Methode auf! Du kannst mit dem Scope-Operator genau festlegen, welche Methode du möchtest, selbst wenn diese überschrieben wurden:
struct Base { void foo() {cout << "Base\n";} }; struct Derived: public Base { void foo() { Base::foo(); cout << "Derived\n"; } };3. Gibt es in C++ genau so, auch über das Schlüsselwort this. this ist aber ein Zeiger auf das Objekt, daher ist die Syntax die von Zeigern:
this->hallo = hallo;(In Java ist es technisch gesehen auch ein Zeiger, weil in Java alles ein Zeiger ist. Aber man merkt es nicht, weil in Java alles ein Zeiger ist
)Alternativ kannst du auch wieder den Scope-Operator nehmen, um zu spezifizieren, welche Variable du genau meinst. Hier also
Auto::hallo = hallo;PS: Wirklich etwas mit Objektorientierung haben deine Fragen nicht zu tun. Das sind alles Syntaxfragen zu C++.
-
Dexter1997 schrieb:
1. Klassenvererbung:
Auto : public Fahrzeug
Warum muß man bei der Vererubung noch Spezifizierer wie "public" angeben, anstatt einfach z.B. "Auto : Fahrzeug" zu schreiben?gäbe es nicht die Möglichkeit die Funktion der vererbenden Klasse zuerst aufzurufen und dann die zusätzlichen Sachen, anstatt das Rad völlig neu zu erfinden?
Klar. Da du ja von Java kommst: dort würdest du einfach super() aufrufen. In C++ gibst du die Klasse explizit, von der du eine geerbte Funktion aufrufen willst, also so:
void Auto::daten_anzeigen() { Fahrzeug::daten_anzeigen(); // mehr Code }Mir geht es um das Schlüsselwort this. Dieses funktioniert in C++ hier scheinbar anders al in Java.
Nein, eigentlich funktioniert das genauso. Nur statt
this.variablemusst duthis->variableschreiben, weil this ein Zeiger ist.Eine Warnung, wenn du von Java kommst:
Im Konstruktor musst du mit virtuellen Funktionen aufpassen. In Java kannst du dort schon virtuelle Funktionen aufrufen des soeben konstruierten Objekts aufrufen, in C++ ist das Objekt erst fertig, wenn der Konstruktor ganz durchgelaufen ist, d.h. im Code "ist" das Objekt noch nicht vom Typ der aktuell zu konstruierenden Klasse. (hoffentlich habe ich mich da halbwegs verständlich ausgepresst...)
-
Vielen Dank das ihr alle meine Fragen super beantwortet habt! Danke!