2011-03-30 1 views
37

Les fonctions virtuelles pures (lorsque nous définissons = 0) peuvent également avoir un corps de fonction. Quelle est l'utilisation pour fournir un corps de fonction pour les fonctions virtuelles pures, si elles ne vont pas être appelées du tout?La fonction virtuelle pure C++ a un corps

+0

double possible de [fonction virtuelle pure mise en œuvre] (http://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) –

+0

Désolé! Je suis un peu nouveau sur ce forum. J'ai accepté les réponses à ce que je ressentais bien. merci pour suggesssions. – Vijay

+0

Copie possible de [fonction virtuelle pure avec implémentation] (https://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) – finnw

Répondre

59

Votre hypothèse selon laquelle la fonction virtuelle pure ne peut pas être appelée est absolument incorrecte. Lorsqu'une fonction est déclarée purement virtuelle, cela signifie simplement que cette fonction ne peut pas être appelée de façon dynamique, via un mécanisme de répartition virtuelle. Pourtant, cette même fonction peut facilement être appelée statiquement, sans répartition virtuelle. En langage C++, un appel statique à une fonction virtuelle est effectué lorsqu'un nom qualifié de la fonction est utilisé dans l'appel, c'est-à-dire lorsque le nom de la fonction spécifié dans l'appel a le formulaire <class name>::<function name>.

Par exemple

struct S { 
    virtual void foo() = 0; 
}; 

void S::foo() { 
    // body for the pure virtual function `S::foo` 
} 

struct D : S { 
    void foo() { 
    S::foo(); // static call to `S::foo` from derived class 
    } 
}; 

int main() { 
    D d; 
    d.S::foo(); // another static call to `S::foo` 
} 
4

Pour la plupart des fonctions virtuelles pures, vous auriez raison. Cependant, pour un destructeur virtuel pur, il est important de définir une implémentation de destructeur correspondante:

  • Le "virtuel pur" doit exiger des classes dérivées pour implémenter leur destructeur.
  • L'implémentation de votre destructeur de classe de base est telle que les destructeurs de classe dérivés peuvent ensuite "s'enchaîner".
+8

(Je réalise que cette réponse date d'un an, mais j'ai juste vu un lien renvoyant les gens à cette question, alors ...) Votre premier point est faux, un destructeur virtuel pur ne force pas les classes dérivées à implémenter un destructeur. La classe dérivée aura toujours un destructeur, même s'il est implicitement défini. Un des avantages d'un destructeur virtuel pur est de rendre un résumé de classe s'il n'a pas d'autres fonctions propres à être virtuel pur. –

19

"Effective C++" Meyers mentionne une raison d'une fonction virtuelle pure à ont un corps: classes dérivées mettent en œuvre cette fonction virtuelle pure peut appeler cette mise en œuvre smwhere dans leur code. Si une partie du code de deux classes dérivées différentes est similaire alors il est logique de le déplacer dans la hiérarchie, même si la fonction doit être pure virtuelle.

voir here.

Questions connexes