198 votes

virtuel? passer outre? ou les deux? C ++

dans les dernières semaines, quelque chose est en écoute mon cerveau sur le virtuel et la remplacer. J'ai appris que quand vous ne l'héritage avec fonction virtuelle, vous devez ajouter virtual pour permettre au compilateur de savoir à la recherche pour le droit de la fonction. Par la suite, j'ai appris aussi qu'en c++ 11, il est un nouveau mot - clé override. Maintenant, je suis un peu confus; Dois-je utiliser à la fois virtuel et remplacer des mots clés dans mon programme, ou il est préférable de n'utiliser que l'un d'entre eux?

Pour m'expliquer des exemples de code de ce que je veux dire:

class Base
{
public:
    virtual void print() const = 0;
    virtual void printthat() const = 0;
    virtual void printit() const = 0;
};

class inhert : public Base
{
public:
    // only virtual keyword for overriding.
    virtual void print() const {}

    // only override keyword for overriding.
    void printthat() const override {}

    // using both virtual and override keywords for overriding.
    virtual void printit() const override {}
};

Quelle est la meilleure méthode?

286voto

Cheers and hth. - Alf Points 59647

Lorsque vous remplacez une fonction que vous n'avez pas techniquement besoin d'écrire, soit virtual ou override.

L'original de la classe de base de la déclaration de besoins le mot-clé virtual pour le marquer comme virtuel.

Dans la classe dérivée de la fonction est virtuelle par le moyen d'avoir la 1same type de la classe de base de la fonction.

Cependant, une override peut aider à éviter des bugs en produisant une erreur de compilation lorsque les remplacer n'est pas techniquement un remplacement. E. g. que le type de fonction n'est pas exactement comme la classe de base de la fonction. Ou qu'un entretien de la classe de base de modifications de la fonction de type, comme par exemple l'ajout d'un argument par défaut.

De la même manière, un virtual mot-clé dans la classe dérivée peut faire un tel bug de plus en plus subtiles, en veillant à ce que la fonction est toujours virtuelle dans d'autres classes dérivées.

Si le conseil général est,

  • Utiliser virtual pour la classe de base de la déclaration de la fonction.
    C'est techniquement nécessaire.

  • Utiliser override (seulement) pour une classe dérivée de " remplacement.
    Cette aide à la maintenance.

Exemple:

struct Base { virtual void foo() {} };
struct Derived: Base { void foo() override {} };

Notes:
1 C++ prend en charge covariante pointeur brut et brut de référence résultats. Avec la covariance du type de la substitution n'est pas exactement la même. Il a juste un type compatible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X