Polymorphie - Virtual
-
Hiho

um direkt zu Sache zukommen

Ich habe folgenden Code:void main() { BMW* meinBMW = new dreierBMW; Auto* meinAuto = meinBMW; meinAuto->Fahren(); } class Auto { public: Auto() { } virtual void Fahren() { } } class BMW : Auto { public: BMW() {} void Fahren() { Beschleunigen(); } virtual void Beschleunigen() { } } class dreierBMW() : BMW { public: dreierBMW() {} void Beschleunigen(); }nun ich möchte die Funktion "Beschleunigen" der Klasse "dreierBMW" mit der Funktion "Fahren" ausführen

aber er führt die Funktion "Beschleunigen" der Klasse BMW aus
was mach ich falsch und was könnte ich tun damit es funktioniert ?
mfg Trekarraz
-
Schritt 1: Aus deinem Quellcode die vielen offensichtlichen Fehler rausmachen. D.h. fehlende Semikolons setzen, falsch gesetzte Klammern entfernen, public-Vererbung statt private, Reihenfolge korrigieren, usw.
Schritt 2: Kontrollausgaben, an denen man überhaupt sieht, was passiertErgebnis:
#include <iostream> using std::cout; class Auto { public: Auto() { } virtual void Fahren() {cout <<"Autofahren\n"; } }; class BMW : public Auto { public: void Fahren() { cout << "BMW fahren\n"; Beschleunigen(); } virtual void Beschleunigen() { cout << "BMW beschleunigen\n";} }; class dreierBMW: public BMW { public: dreierBMW() {} void Beschleunigen() {cout << "3er BMW beschleunigen\n";}; }; int main() { BMW* meinBMW = new dreierBMW; Auto* meinAuto = meinBMW; meinAuto->Fahren(); }Doch oh Schreck!
Der Code funktioniert:
http://ideone.com/e79CEGDa hast du wohl
http://www.c-plusplus.net/forum/304133
nicht beachtet und es ist genau das passiert, weshalb dieser Beitrag als wichtig markiert ist.
-
ohh verdammt ... sry ...
hab nen anderen Code gehabt der viel mehr Funktionen etc beeinhaltet und ich dachte lieber machst du ne einfache Version damit nicht alles zugeknallt wird ...
und genau da hab ich alles richtig gecodet aka hab ein virtual im Original vergessen >_<
-
Trekarraz schrieb:
void main() { BMW* meinBMW = new dreierBMW; // Schrott, Klasseninstanzen mit new zu erzeugen Auto* meinAuto = meinBMW; // Schrott, eine Oberklassen-Quasi-Instanz auf eine Unterklassen-Quasi-Instanz verweisen zu lassenaber er führt die Funktion "Beschleunigen" der Klasse BMW aus
Weil die Methode dort definiert ist, deshalb führt "er" sie "dort" aus.