2016-09-05 2 views
-10

Supposons que j'ai ce morceau de code:C++ abstrait héritage de classe

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; 

J'ai quelques questions à ce sujet: D

1) LandVehicle ne met pas en œuvre la vitesse(). est-ce une erreur et si oui, quel genre d'erreur? ou est-ce que ça en fait aussi une classe abstraite?

2) est le mot-clé override dans LandVehicle dans method media() correctement utilisé? en tant que classe dérivée d'une classe abstraite est-elle vraiment en train de surcharger la méthode?

3) Identique à 2 pour outrepasser dans la méthode speed() de Train.

4) est former une classe concrète maintenant?

5) est-il nécessaire d'ajouter le mot-clé virtuel dans la déclaration de la méthode media() de LandVehicle?

6) si j'ajoute cette méthode dans la classe de train:

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

t-il cacher les médias LandVehicle() ou faut-il la remplacer? 7) Après l'ajout de la méthode en 6, peut-on accéder au support de LandVehicle() dans la classe Train?

+6

Il y a trop de questions, et pour la plupart d'entre eux vous pouvez trouver la réponse rapidement par vous-même tester. – Aracthor

+0

Avez-vous essayé de rechercher ceci vous-même? Qu'avez-vous trouvé et comment a-t-il échoué à répondre à vos questions? – Angew

+1

Je suis d'accord ici.Il suffit généralement d'écrire la sortie de code/test généralement plus rapidement que de taper le code/la question sur stackoverflow. – Hayt

Répondre

5

1.) Oui LandVehicle est toujours abstrait. Pour qu'une classe soit instanciable, vous devez avoir implémenté toutes les méthodes virtuelles pures.

2.) Oui. override est un mot-clé pour le compilateur qu'il doit remplacer une autre méthode. Si par exemple vous changez la signature dans la classe de base. Le compilateur vous donnera une erreur ici (si vous ne l'utilisez override il suppose qu'il est une « nouvelle » méthode)

3.) même réponse que l'utilisateur 2. remplacer aussi souvent que possible si vous remplacez une méthode.

4.) Oui. Toutes les méthodes virtuelles (abstraites) pures ont maintenant une implémentation.

5.) Non. Le virtuel doit seulement être ajouté dans la classe de base. Il n'est pas nécessaire dans les classes dérivées pour la même méthode.

6.) Oui. overrride est juste un mot-clé pour le compilateur à vérifier. Il ne fait pas vraiment le dépassement ou pas (virtual est important pour cela). Vous pouvez laisser le remplacement si la déclaration, mais il est généralement plus sûr de toujours l'utiliser.

7.) Oui, vous pouvez utiliser LandVehicle::media()