Vidéo: Virtual Functions & Abstract Classes in C++ | C++ Programming Tutorials 2024
Une classe abstraite en C ++ est une classe avec une ou plusieurs fonctions virtuelles pures. Une fonction virtuelle pure est une fonction membre virtuelle marquée comme n'ayant aucune implémentation. Très probablement, il n'a pas d'implémentation car aucune implémentation n'est possible avec les informations fournies dans la classe, y compris les classes de base.
Une fonction virtuelle non pure conventionnelle et banale est appelée fonction concrète (notez qu'une fonction concrète peut être virtuelle - malheureusement, C ++ utilise ce terme pour désigner polymorphique.
La syntaxe pour déclarer une fonction pure virtual est démontrée dans la classe suivante: Account
// Account - cette classe est une classe de classe abstraite Account {public: Compte (non signé accNo, double initialBalance = 0. 0); // fonctions d'accès unsigned int compteNo (); double acntBalance (); static int noAccounts (); // fonctions de transaction void deposit (double montant); // les éléments suivants est une fonction virtuelle pure retrait de vide virtuel (double montant) = 0; protected: // garde les comptes dans une liste chaînée donc il n'y a pas de limite // au nombre de comptes static int count; // nombre de comptes unsigned accountNumber;;};
Le = 0 après la déclaration de retrait () indique que le programmeur n'a pas l'intention de définir cette fonction. on est un espace réservé pour les sous-classes. Les sous-classes de Account devraient remplacer cette fonction par une fonction concrète. Le programmeur doit fournir une implémentation pour chaque fonction membre non déclarée virtuelle pure.
Certains programmeurs pensent que cette notation est stupide. Mais il est là pour rester, alors il faut juste apprendre à vivre avec. Il y a une raison, sinon une justification, pour cette notation. Chaque fonction virtuelle doit avoir une entrée dans une table spéciale.
Cette entrée contient l'adresse de la fonction. Vraisemblablement, au moins à un moment, l'entrée pour une fonction virtuelle pure était 0. Dans tous les cas, c'est la syntaxe avec laquelle vous êtes coincé maintenant.
Une classe abstraite ne peut pas être instanciée avec un objet; c'est-à-dire que vous ne pouvez pas faire un objet hors d'une classe abstraite. Par exemple, la déclaration suivante n'est pas légale:
void fn () {// déclare un compte avec 100 dollars Account acnt (1234, 100. 00); // ce n'est pas légal acnt. retrait (50); // qu'attendriez-vous} // cet appel à faire?
Si la déclaration était autorisée, l'objet résultant serait incomplet et manquerait de certaines capacités. Par exemple, que devrait faire l'appel précédent? Rappelez-vous, il n'y a pas de compte:: retrait () .
Les classes abstraites servent de classes de base pour les autres classes. Un compte contient toutes les propriétés associées à un compte bancaire générique. Vous pouvez créer d'autres types de comptes bancaires en héritant du compte .
Le terme technique est instancier . Vous dites que la classe Account ne peut pas être instanciée avec un objet ou qu'un objet donné instancie la classe Savings .