1719 votes

Quelle est la différence entre une fonction abstraite et une fonction virtuelle?

Dans quels cas est-il recommandé d'utiliser virtuel ou abstrait? Quelle est l'approche la plus correcte?

2913voto

BFree Points 46421

Une fonction abstraite ne peut avoir aucune fonctionnalité. Vous êtes en train de dire que toute classe enfant DOIT donner sa propre version de cette méthode, mais il est trop général pour essayer même de l'implémenter dans la classe parente. Une fonction virtuelle, c'est essentiellement dire look, voici la fonctionnalité qui peut ou ne peut pas être assez bon pour la classe enfant. Donc, si cela est suffisant, utilisez cette méthode, sinon, remplacez-moi, et fournissez vos propres fonctionnalités.

329voto

JoshBerke Points 34238

Une fonction abstraite n'a pas d'implémentation et elle ne peut être déclarée que sur une classe abstraite. Cela force la classe dérivée à fournir une implémentation. Une fonction virtuelle fournit une implémentation par défaut et peut exister sur une classe abstraite ou une classe non abstraite. Donc par exemple:

 public abstract class myBase
{
    //If you derive from this class you must implement this method. notice we have no method body here either
    public abstract void YouMustImplement();

    //If you derive from this class you can change the behavior but are not required to
    public virtual void YouCanOverride()
    { 
    }
}

public class MyBase
{
   //This will not compile because you cannot have an abstract method in a non-abstract class
    public abstract void YouMustImplement();
}
 

88voto

Mehrdad Afshari Points 204872
<ol> <li>Seulement <code></code> classes peuvent avoir <code></code> membres.</li> <li>Un non - <code></code> classe qui hérite d’un <code></code> classe <strong>doit</strong> <code></code> son <code></code> membres.</li> <li>Un <code></code> membre est implicitement <code></code> .</li> <li>Un <code></code> membre ne peut pas fournir d’implémentation ( <code></code> est appelé <code></code> dans certaines langues).</li> </ol>

71voto

Rinat Abdullin Points 13520

Vous devez toujours substituer une fonction abstraite.

Donc :

  • Fonctions abstraites - lorsque l’héritier doit fournir sa propre implémentation
  • Virtual - quand il revient à l’héritière de décider

29voto

Frederik Gheysels Points 36354

La méthode abstraite: Si une classe contient une méthode abstraite, cette classe doit être déclarée abstraite. La méthode abstraite n'a pas de mise en œuvre et ainsi, les classes dérivant de cette classe abstraite, doit fournir une implémentation de cette méthode abstraite.

Méthode virtuelle: Une classe peut avoir une méthode virtuelle. La méthode virtuelle est mise en œuvre. Lorsque vous héritez d'une classe qui possède une méthode virtuelle, vous pouvez remplacer la méthode virtuelle et de fournir plus de logique, ou de remplacer la logique avec votre propre mise en œuvre.

Quand utiliser ce: Dans certains cas, vous savez que certains d'entre eux doivent avoir une méthode spécifique, mais vous ne savez pas ce que la mise en œuvre de cette méthode doit avoir.
Dans de tels cas, vous pouvez créer une interface qui contient une méthode avec cette signature. Toutefois, si vous avez un tel cas, mais vous savez que des réalisateurs de cette interface aura également une autre méthode commune (pour lesquelles vous pouvez déjà la mise en œuvre), vous pouvez créer une classe abstraite. Cette classe abstraite contient alors la méthode abstraite (qui doit être surchargée), et une autre méthode qui contient la "commune" de la logique.

Une méthode virtuelle doit être utilisé si vous avez une classe qui peut être utilisé directement, mais pour lequel vous souhaitez héritiers pour être en mesure de modifier certains comportements, bien qu'il n'est pas obligatoire.

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