2016-05-25 7 views
1

Ich habe die Member-Funktionen der Elternklasse öffentlich gemacht. Aber trotzdem bekomme ich einen FehlerWie definiert man eine Funktion der Elternklasse mit Vererbung?

no 'Leeres Motorrad :: speeddown() Member-Funktion in der Klasse deklariert 'Motorrad'

sowohl für speedup und speeddown. Obwohl ich die Elternklasse öffentlich geerbt habe.

#include <iostream> 
#include<string.h> 
using namespace std; 

class Bicycle 
{ 
protected: 
    int speed; 
    char color[8]; 
public: 
    Bicycle(int, char*); 
    void speedup(); 
    void speeddown(); 
    void turnLeft(); 
    void turnRight(); 
}; 

class MotorBike:public Bicycle 
{ 
private: 
    int currentGear; 
    int currentFuel; 
public: 
    MotorBike(int,char*,int,int); 

}; 

Bicycle::Bicycle(int Speed,char* Color) 
{ 
    speed=Speed; 
    strcpy(color,Color); 
    cout<<"The bike is now moving north!"<<endl; 
} 

MotorBike::MotorBike(int Speed,char* Color,int CurrentGear,int CurrentFuel): Bicycle(speed,color) 
{ 
    speed=Speed; 
    strcpy(color,Color); 
    currentGear=CurrentGear; 
    currentFuel=CurrentFuel; 
    cout<<"The motorbike is now moving north!"<<endl; 
} 

void Bicycle::speedup()//error line 
{ 
    cout<<"Speed is increased!"<<endl; 
    speed+=1; 
} 

void Bicycle::speeddown()//error line 
{ 
    if(speed>1) 
    { 
     cout<<"Speed is decreased!"<<endl; 
     speed-=1; 
    } 
    else 
     cout<<"The bike is already at rest!"<<endl; 

} 

void MotorBike::speedup()//error line 
{ 
    if(currentGear==4) 
     cout<<"You are already at maximum speed!"<<endl; 
    else 
    { 
     switch(currentGear) 
     { 
     case 0: 
      currentGear=1; 
      currentFuel-=0.01; 
      speed+=0.25; 
      break; 
     case 1: 
      currentGear=2; 
      currentFuel-=0.02; 
      speed+=0.5; 
      break; 
     case 2: 
      currentGear=3; 
      currentFuel-=0.03; 
      speed+=0.75; 
      break; 
     case 3: 
      currentGear=4; 
      currentFuel-=0.04; 
      speed+=1; 
      break; 

     } 
    } 
} 

void MotorBike::speeddown()//error line 
{ 
    if(speed==1||speed>1) 
    speed-=1; 
    else 
     cout<<"You are already at minimum speed!"<<endl; 
} 

int main() 
{ 
    Bicycle B1(0,"Black"); 
    MotorBike MB1(0,"Black",0,100); 
} 

Antwort

1

Ihr MotorBike hat keine Funktion speedup noch speeddown. Wenn Sie wollen, möchten, haben Sie es in der MotorBike Klasse zu erklären, wie

class MotorBike:public Bicycle 
{ 
private: 
    int currentGear; 
    int currentFuel; 
public: 
    MotorBike(int,char*,int,int); 
    void speedup(); 
    void speeddown(); 
}; 
+0

aber mein Fahrrad haben sie und ich habe sie vom Fahrrad geerbt. –

+0

@AhmadShafique, stimmt - aber Sie haben die Definition auch schon geerbt. Wenn Sie eine andere Definition für die nachgeordnete Klasse angeben möchten, müssen Sie sie ** überschreiben. – SergeyA

+0

ja richtig. Vielen Dank! –

0

Ich werde einfach gehen von oben nach unten auf diesen einen:

Ihre #include <string.h>-#include <string> veraltet ändern.

Ihr Fahrrad hat Funktionen ohne Definition, die LNK2019 (nicht aufgelöste externe) ergeben, wenn etwas versucht, sie aufzurufen. Entweder definieren Sie sie, entfernen Sie sie oder machen Sie Bicycle zu einer abstrakten Klasse. Fahrrad hat auch Kinder, also geben Sie ihm einen virtuellen Zerstörer.

Bicycle(int, char*); 
virtual ~Bicycle() = default; 
virtual void speedup(); 
virtual void speeddown(); 
virtual void turnLeft(); 
virtual void turnRight(); 

Sie definieren Funktionen, die Mitglieder von MotorBike sind, aber Sie haben sie nie deklariert. Fügen Sie sie auf die Erklärung des Motorrads:

class MotorBike:public Bicycle 
{ 
private: 
    int currentGear; 
    int currentFuel; 
public: 
    Motorbike(int,char*,int,int); 
    void speedup(); 
    void speeddown(); 
}; 

Verwenden Sie das override Schlüsselwort beim Überschreiben Fahrradfunktionen in Motorrad:

class MotorBike:public Bicycle 
{ 
private: 
    int currentGear; 
    int currentFuel; 
public: 
    Motorbike(int,char*,int,int); 
    void speedup() override; // like this 
    void speeddown() override; // and this 
}; 

Oder alternativ verwenden, um alle Standard-Funktionen implementiert mit dem Fahrrad Motorrad:

class MotorBike:public Bicycle 
{ 
private: 
    int currentGear; 
    int currentFuel; 
public: 
    Motorbike(int,char*,int,int); 
    using Bicycle::speedup; // like this 
    using Bicycle::speeddown; // and this 
}; 

Korrigieren Sie Ihre Datentypen. MotorBike deklariert currentGear und currentFuel als Ganzzahlen, aber in MotorBike::speedup zum Beispiel fügen Sie Gleitkommawerte zu ihnen hinzu. Dies wird nicht funktionieren, da die Bruchteile dieser Werte abgeschnitten werden.

Verwandte Themen