PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vererbung in C++


Einfachkrank
2004-03-10, 19:39:17
Hi,

hätte da zwei Fragen:

1. Wenn ich eine Klasse an eine andere vererbe und beide haben einen Konstruktor - wird dann beim Anlegen einer Instanz der Konstruktor der vererbten Klasse auch mit aufgerufen?

2. Wenn ich in zwei Klassen eine Funktion mit dem selben Namen habe und diese zwei Klassen beide an eine neue vererbe, welche Funktion bleibt dann bestehen, wenn vor beiden ein virtual steht?

MFG Einfachkrank

Brillus
2004-03-10, 22:06:39
zu 1. als erstes wird der Konstruktor von der Klasse ausgeführt von der abgeleitet wurde und dann der von der endgültigen Version.(Beim Destruktor ist es dann andersherum.

zu 2. weis nicht was du da jetzt damit meinst.

HellHorse
2004-03-10, 23:55:20
Ich glaube er meint Mehrfachvererbung.
Richtig lustig ist das aber erst, wenn man Diamant-Strukturen aufbaut. :D

Elemental
2004-03-11, 10:12:48
zu 2.: Das virtual vor den Methoden bedeutet ja, dass die Methode in der abgeleiteten Klasse überschreiben musst. In der überschriebenen Methode kannst du dann nach belieben eine der beiden Basis-Methoden aufrufen.


mfG
Elemental

Chris Lux
2004-03-11, 10:28:11
Original geschrieben von Elemental
zu 2.: Das virtual vor den Methoden bedeutet ja, dass die Methode in der abgeleiteten Klasse überschreiben musst.


blödsinn, das virtual bedeutet, dass die methoden in eine virtuelle funtions tabelle gepackt werden, sie so überschrieben werden _können_(!) und garantiert ist, dass die richtige methode (polymorphismus lässt grüssen) aufgerufen werden kann abhängig vom typ der klasse die die nachricht empfängt.

steht das virtual nicht da ist nicht gesichert, dass beim überladen und aufruf der methode durch eine abgeleitete klasse die korrekte funktion aufgerufen wird.

A virtual function is a member function that you expect to be redefined in derived classes. When you refer to a derived class object using a pointer or a reference to the base class, you can call a virtual function for that object and execute the derived class's version of the function.

Virtual functions ensure that the correct function is called for an object, regardless of the expression used to make the function call.


p.s. castest du nun ein abgeleitetes object auf ein übergeordnetes und machst den methosenaufruf ist es möglich die überschriebenen methoden zu benutzen.

Elemental
2004-03-11, 10:35:08
Original geschrieben von Hans Ohlo
blödsinn, das virtual bedeutet, dass die methoden in eine virtuelle funtions tabelle gepackt werden, sie so überschrieben werden _können_(!) und garantiert ist, dass die richtige methode (polymorphismus lässt grüssen) aufgerufen werden kann abhängig vom typ der klasse die die nachricht empfängt.

steht das virtual nicht da ist nicht gesichert, dass beim überladen und aufruf der methode durch eine abgeleitete klasse die korrekte funktion aufgerufen wird.

A virtual function is a member function that you expect to be redefined in derived classes. When you refer to a derived class object using a pointer or a reference to the base class, you can call a virtual function for that object and execute the derived class's version of the function.

Virtual functions ensure that the correct function is called for an object, regardless of the expression used to make the function call.




Ok, sorry. Is schon ne Weile her, dass ich C++ programmiert hab...

Xmas
2004-03-11, 13:30:50
Original geschrieben von Einfachkrank
1. Wenn ich eine Klasse an eine andere vererbe und beide haben einen Konstruktor - wird dann beim Anlegen einer Instanz der Konstruktor der vererbten Klasse auch mit aufgerufen?
Wenn es ein Konstruktor ohne Parameter ist, ja. Ansonsten musst du die Initialisierungsliste benutzen. Dann sieht der Konstruktor von der Klasse Unter, abgeleitet von Ober, so aus:

Unter(int i): Ober(i)
{
// bla
}

2. Wenn ich in zwei Klassen eine Funktion mit dem selben Namen habe und diese zwei Klassen beide an eine neue vererbe, welche Funktion bleibt dann bestehen, wenn vor beiden ein virtual steht?
Beide bleiben bestehen. Zweideutigkeit bei Multiple Inheritance musst du mit dem Scope-Operator :: ausräumen. Wenn du also eine Funktion f in den Klassen A und B hast, und eine Klasse die von beiden erbt, musst du entweder A::f() oder B::f() schreiben.