web-dev-qa-db-fra.com

Les méthodes abstraites et les fonctions virtuelles pures sont-elles la même chose?

Pour autant que je sache, les méthodes abstraites et les fonctions virtuelles pures ne fournissent aucune fonctionnalité ... Alors, pouvons-nous dire qu'elles sont toutes les deux la même chose?

Supposons également qu'une classe (pas nécessairement déclarée abstraite) contienne un certain nombre de méthodes implémentées (ni abstraites ni virtuelles), mais contient une fonction virtuelle pure. Cette classe est-elle alors abstraite?

52
Ahmad

Oui, c'est la même chose. En C++, une méthode abstraite n'est qu'une autre façon de décrire les caractéristiques d'une fonction virtuelle pure. Les deux signifient simplement une méthode sans implémentation fournie qui doit être implémentée dans une sous-classe avant que la classe puisse réellement être instanciée.

La situation avec des fonctions virtuelles pures et des classes abstraites en C++ est similaire car elles signifient essentiellement exactement la même chose. Toute classe abstraite doit avoir au moins 1 fonction virtuelle pure, sinon elle pourrait être instanciée et ne serait pas abstraite. De même, toute classe avec au moins 1 fonction virtuelle pure doit être abstraite car elle doit être étendue pour que la méthode puisse réellement être implémentée.

Par conséquent, une classe est abstraite si et seulement si elle contient au moins 1 fonction virtuelle pure/méthode abstraite.

Plus tard, des langages comme Java et C # ont rendu les choses comme cela plus explicites, permettant à un mot-clé spécial de définir un résumé de classe plutôt que la présence d'une fonction purement virtuelle. C++ vous permet de faire de même des choses comme ces langues, mais elles sont juste un peu plus explicites à ce sujet.: D

57
Gordon Gustafson

Vous ne déclarez pas explicitement des classes ou des méthodes comme abstraites en C++. La présence de méthodes virtuelles pures est ce qui les rend abstraites.

15
Jordão

Oui, les méthodes abstraites sont exactement la même chose que les fonctions virtuelles pures; les termes sont souvent utilisés de manière interchangeable. IMO, "Pure virtual function" est le terme techniquement correct en C++ qui dénote spécifiquement le fait que la fonction est définie sur 0:

class myClass {
public:
  virtual void vfunc() = 0; // pure specifier
};

Une classe abstraite est définie par :

une classe conçue pour être spécifiquement utilisée comme classe de base. Une classe abstraite contient au moins une fonction virtuelle pure.

Donc, fondamentalement, une classe abstraite est une classe abstraite, car elle est conçue pour être une classe de base (certaines classes de base, par définition, doivent avoir des méthodes implémentables qui devront être purement virtuelles). Ces classes deviennent des classes abstraites simplement par la façon dont elles sont utilisées et étendues. Contrairement aux langages comme Java, il n'y a pas de modificateur de mot clé abstract ou interface c'est pourquoi nous avons besoin d'un "contrat verbal" pour parler des classes abstraites en C++.

6
David Titarenco

En C++, une fonction de membre virtuel pur conduit à ce que le type englobant soit un "type abstrait".

Les fonctions elles-mêmes ne peuvent pas être abstraites, bien que le terme soit fréquemment utilisé à mauvais escient de cette manière.

Je dirais que oui, les méthodes abstraites et les fonctions virtuelles pures sont conceptuellement la même chose.

Supposons également qu'une classe (pas nécessairement déclarée abstraite) contienne un certain nombre de méthodes implémentées (ni abstraites ni virtuelles), mais contient une fonction virtuelle pure. Cette classe est-elle alors abstraite?

Une classe avec au moins 1 fonction virtuelle pure est appelée classe abstraite.

3
Akhil