2016-09-05 3 views
-10

Angenommen, dass ich dieses Stück Code haben:C++ abstrakte Klassenvererbung

class Vehicle { 
    virtual const char* media() const = 0; 
    virtual unsigned speed() const = 0; 
} V, *PV; 
class LandVehicle : public Vehicle { 
    const char* media() const override{ return "Land";} 
} L, *PL; 
class Train : public LandVehicle{ 
    virtual unsigned speed() const override {return 130;} 
} T, *PT; 

Ich habe ein paar Fragen zu diesem Thema: D

1) LandVehicle nicht Geschwindigkeit nicht implementiert(). ist das ein Fehler und wenn ja, welche Art von Fehler? oder macht es auch nur eine abstrakte Klasse?

2) ist das Schlüsselwort Override in der Klasse LandVehicle in method media() korrekt verwendet? als eine abgeleitete Klasse von einer abstrakten Klasse überschreibt es wirklich die Methode?

3) wie 2 für Override in der Geschwindigkeit() Methode von Train.

4) Trainiere jetzt eine konkrete Klasse?

5) muss das Schlüsselwort virtuell in die Deklaration der media() Methode von LandVehicle eingefügt werden?

6), wenn ich diese Methode in Train-Klasse hinzufügen:

const char* media() const{ return "Just a train";} 

macht es LandVehicle Medien() verstecken oder es enthebt?

7) nach dem Hinzufügen der Methode in 6, kann LandVehicle Medien() in der Zugklasse zugegriffen werden?

+6

Es gibt zu viele Fragen, und für die meisten von ihnen verwenden, können Sie die Antwort schnell durch Testen selbst finden können. – Aracthor

+0

Haben Sie versucht, dies selbst zu erforschen? Was hast du gefunden und wie hat es versagt, deine Fragen zu beantworten? – Angew

+1

Ich stimme hier zu.Schnell ist das Schreiben der Code-/Testausgabe in der Regel schneller als das Eingeben des Codes/der Frage in stackoverflow. – Hayt

Antwort

5

1.) Ja LandVehicle ist immer noch abstrakt. Damit eine Klasse instanziierbar ist, müssen Sie alle rein virtuellen Methoden implementiert haben.

2.) Ja. override ist ein Schlüsselwort für den Compiler, dass es eine andere Methode überschreiben sollte. Wenn Sie z.B. Ändern Sie die Signatur in der Basisklasse. Der Compiler wird Ihnen hier einen Fehler geben (wenn Sie keine Überschreibung verwenden, geht es davon aus, dass es sich um eine "neue" Methode handelt)

3.) gleiche Antwort wie 2. Benutzer überschreiben so oft wie möglich, wenn Sie eine überschreiben Methode.

4.) Ja. Alle rein virtuellen (abstrakten) Methoden haben jetzt eine Implementierung.

5.) Nein. Das virtuelle muss nur in der Basisklasse hinzugefügt werden. Es wird nicht in abgeleiteten Klassen für die gleiche Methode benötigt.

6.) Ja. overrride ist nur ein Schlüsselwort für den Compiler zu überprüfen. Es ist nicht wirklich das Überschreiben oder nicht (virtual ist wichtig dafür). Sie können Überschreibung auslassen, wenn die Deklaration, aber es ist in der Regel sicherer, es immer zu verwenden.

7.) Ja Sie LandVehicle::media()