6
votes

Comment savoir quand la fonction doit être virtuelle?

En décrivant une classe, comment savoir quand la fonction doit être virtuelle?

Je sais quelle fonction virtuelle signifie, mais je ne peux tout simplement pas comprendre quand je devrais les faire virtuel

merci


3 commentaires

Si vous pensez au mot clé virtuel dans votre classe, commencez par ce destructeur doit être virtuel.


@Kirill v. Lyadvinsky, pas toujours: blogs.msdn .Com / B / OldNewthing / Archive / 2004/05/07 / 127826.aspx :)


L'article ne dit rien contre ma déclaration.


7 Réponses :


1
votes

Si votre classe va avoir des fonctions virtuelles dépend de la question de savoir si la classe va être utilisée comme classe de base, qui devrait dépendre de la conception et de l'architecture.


0 commentaires

3
votes

Les fonctions doivent être virtuelles si vous souhaitez les appeler polymorphiquement . En d'autres termes, le comportement rapide de la fonction virtuelle peut être personnalisé dans des sous-classes. Par exemple, envisagez la classe suivante: xxx

chaque voiture a un ID , et il n'y a pas de personnalisation autorisée ici, il n'ya donc aucun point dans la fabrication virtuelle. Les sous-classes ne doivent pas être en mesure de modifier cette propriété. Comment le moteur est commencé cependant, dépend de la voiture spécifique et peut en fait ne pas être définie dans le monde entier. Mais nous savons que chaque voiture doit démarrer le moteur avant que nous puissions conduire, nous le définissons donc comme une fonction virtuelle pure.

une directive importante pour faire une fonction virtuelle, et quand non, est Donné par le interface non virtuelle idiom.


1 commentaires

Je vous remercie. Dans cet exemple, nous devons hériter de la classe à cause de la fonction virtuelle pure. Mais si nous faisons "VOID Startengine () {};" ça devrait marcher quand même, non?



0
votes

Lorsque vous souhaitez que votre classe soit traitée comme classe de base d'une autre classe et que vous pensez qu'il existe certaines fonctions dans votre classe que les classes dérivées pourraient remplacer, alors c'est une bonne indication que vous devriez faire ces fonctions virtuel . Les faire virtuel active le polymorphisme d'exécution! Cela signifie que vous pouvez utiliser les classes polymorphiquement, c'est-à-dire à l'aide de pointeur / référence de la classe de base de type, mais pointant vers un objet de classe dérivé!

En bref, dans la conception de la classe basée sur l'interface, il convient de créer des fonctions virtuel .

Rappelez-vous toujours une chose: ne doit pas oublier de faire le destructeur de la classe de base virtuel lors de la conception de classes polymorphes!


0 commentaires

0
votes

en termes de conception de logiciels, si vous essayez de définir et de définir une classe ou une interface abstraite, vous utiliserez un mot-clé virtuel pour appliquer le polymorphisme dynamique.


0 commentaires

1
votes

Cela dépend de la possibilité que les classes dérivées puissent avoir une fonctionnalité différente pour la fonction membre présente dans la classe de base. Prenant la conception d'un Polygon Strong> Classe -

class Square : public Polygon
{
    public:
    float area()
    {
         // area = side*side;
    }
};


1 commentaires

@Vextor - pourquoi pensez-vous. Et si le type d'opérande statique est différent de son type dynamique? polygone * obj = nouveau carré;



0
votes

Vous devez faire la méthode virtuelle lorsque vous savez que le comportement de la méthode peut ou va changer dans les classes héritantes de cette classe. Plus précisément, si vous voulez une sous-classe écraser cette méthode, faites-la virtuelle. Si vous ne souhaitez pas mettre en œuvre cette méthode dans votre classe de base, faites-la en faire pure virtuelle: IE:

virtual void f() = 0;


0 commentaires

1
votes

Vous devez effectuer des fonctions virtuelles si vous souhaitez utiliser vos objets via un pointeur ou une référence à une classe de base. Vous pouvez ensuite appeler la fonction de classe dérivée, sans savoir exactement quel type il est.

Si vous utilisez chaque classe séparément et connais le type de chaque objet, vous n'avez pas besoin de fonctions virtuelles, même si vous utilisez des classes dérivées.


0 commentaires