Pourquoi ne pouvons-nous pas créer une instance d'une classe abstraite?
J'ai trouvé dans de nombreux endroits :
- Une Classe Abstraite est une classe qui est censé être utilisé comme une classe de base.
- Une Classe Abstraite est une classe qui possède au moins une Fonction Virtuelle Pure.
Mais une chose qui frappe toujours mon esprit, c'est pourquoi nous ne pouvons pas créer une instance d'une classe abstraite? Beaucoup d'endroits sur l'Internet disent qu'il n'ya pas de point dans la création d'une instance, ou certains disent qu'ils sont censés être utilisés comme des classes de base. Mais pourquoi est-ce une erreur de créer une instance d'une classe abstraite?
source d'informationauteur Vijay
Vous devez vous connecter pour publier un commentaire.
Votre
void bar()=0;
n'est pas valide -- le=0
notation peut être utilisée uniquement avec des fonctions virtuelles.Le point de l'ensemble d'une classe abstraite, c'est que c'est abstrait -- vous avez défini une interface, mais non de mise en œuvre. Sans une mise en œuvre, l'instanciation de la classe ne serait pas produire un sens ou un résultat utile. Si elle n'est/serait logique pour instancier des objets de cette classe, alors vous ne voulez pas utiliser une classe abstraite en premier lieu.
Considérons, par exemple, les pilotes de périphérique. Nous pourrions avoir un pilote pour un résumé de périphérique de stockage. Nous définissons certaines fonctions de cet appareil, telles que la lecture et l'écriture de données. Cette classe abstraite donne tout le code qui veut lire/écrire des données, la capacité à travailler avec un béton de classe qui dérive de cette classe abstraite.
On ne peut pas instancier notre résumé périphérique de stockage. Au lieu de cela, nous avons besoin d'un objet concret comme une clé usb, un disque dur, etc., effectivement lecture/écriture. La classe de béton est nécessaire parce que nous avons besoin de code spécifique à l'appareil réel pour effectuer les commandes que nous l'avons défini dans notre base abstraite. Notre résumé de stockage de classe a lire ou à écrire, mais ne la lecture ou de l'écriture, nous avons besoin d'un pilote pour un périphérique spécifique. On pourrait savoir comment parler à un disque dur SATA, tandis que l'autre sait comment parler à une clé USB et un tiers sait lire ou écrire sur une carte SD. Nous ne peut pascependant, il suffit de dire "je vais créer un résumé périphérique de stockage", et de parler d'elle sans en définir le code qui va traduire une commande "write" (par exemple) le droit de signaux allant de plus de SATA, USB, Firewire, etc., pour obtenir les données sur un disque réel.
En tant que tel, d'une tentative d'instancier notre classe abstraite n'a aucun sens, et n'est pas autorisé. Nous utiliserons la classe de base abstraite de sorte que le reste du système peut faire face à tous les appareils de manière uniforme. Le reste du code ne se soucie pas de la façon dont les signaux sont différents les uns des autres -- il voit tout un tas de lecteurs de disque, et peut travailler avec tous, même si les détails de la lecture des données sur USB sont complètement différentes de la lecture de plus de Firewire (par exemple).
Une classe abstraite représente quelque chose qui n'est pas assez précis pour être instancié. Par exemple, si quelqu'un vous a demandé de créer un véhicule? Vous auriez à demander, "quel type de véhicule?" Vous ne savez pas s'il faut créer une voiture, un traîneau ou d'une navette spatiale. Il n'y a pas de tel objet comme un "véhicule". Pourtant, "véhicule" est une abstraction utile qui peut être utilisé pour les objets de groupe, en indiquant les comportements communs entre eux. C'est ce que les classes abstraites sont pour.
Une classe abstraite est plus qu'une interface. Il peut avoir des données membres. Il peut avoir les fonctions membres qui ne sont pas du pur virtuel, ou de la non-virtuel. Même une fonction virtuelle pure peut avoir un corps, en fournissant une implémentation par défaut. Donc, ce n'est pas une impossibilité physique de l'instanciation d'une classe abstraite.
Le point principal est que d'une fonction virtuelle pure est une fonction virtuelle qui doit être remplacée par une classe dérivée. Cela signifie qu'une classe dérivée doit être défini, et la manière de force qui consiste à interdire l'instanciation d'une classe abstraite.
Une classe abstraite n'est pas assez précis pour être instancié. Pas nécessairement parce qu'il manque une définition d'une fonction, car il ne peut pas être absent. Il n'est pas assez précis, car il représente un résumé concept, qui doit être rendu plus spécifique avant de il peut être instancié.
C'est le point de l'ensemble d'une classe abstraite: que certains détails doivent être fournis par le réalisateur.
Penser: quel serait le point de marquage d'une classe de base abstraite qui pourrait l'instancier directement? Ensuite, il ne serait pas différente de toute autre classe.
La raison pour laquelle une classe abstraite ne peut pas être instancié est: que faites-vous si vous exécutez la fonction virtuelle pure? Que serait une grave erreur, et c'est mieux pour attraper qu'au moment de la compilation que lors de l'exécution.
Dans la classe abstraite aucune définition de la méthode est donné, que la structure est fournie. Si l'on peut instancier une classe abstraite et ceux de la méthode, ce sera un énorme gâchis. Classe abstraite est utilisé pour maintenir un modèle de conception du code.