pur-spécificateur sur fonction-définition
Lors de la compilation sur GCC, j'obtiens l'erreur : pure-specifier sur function-definition, mais pas quand je compile le même code en utilisant VS2005.
class Dummy {
//error: pure-specifier on function-definition, VS2005 compiles
virtual void Process() = 0 {};
};
Mais lorsque la définition de cette fonction virtuelle pure n'est pas en ligne, cela fonctionne:
class Dummy
{
virtual void Process() = 0;
};
void Dummy::Process()
{} //compiles on both GCC and VS2005
Que signifie l'erreur? Pourquoi ne puis-je pas le faire en ligne? Est-il légal d'échapper au problème de compilation comme indiqué dans le deuxième exemple de code?
6 réponses
Ok, je viens d'apprendre quelque chose. Une fonction virtuelle pure doit être déclarée comme suit:
class Abstract
{
public:
virtual void pure_virtual() = 0;
};
Il peut avoir un organisme, bien qu'il soit illégal de l'inclure au point de déclaration. Cela signifie que pour avoir un corps, la fonction virtuelle pure doit être définie en dehors de la classe. Notez que même si elle a un corps, la fonction doit toujours être remplacée par des classes concrètes dérivées de Abstract
. Ils auraient juste une option pour appeler Abstract::pure_virtual()
explicitement s'ils en ont besoin.
Le les détails sont ici.
Norme C++, 10.4 / 2:
Une déclaration de fonction ne peut pas fournir à la fois un spécificateur pur et une définition
Des fonctions virtuelles Pures en C++, par définition, n'ont aucune définition de dans la déclaration.
Votre deuxième bloc de code n'évite pas le problème du compilateur. Il implémente une fonction virtuelle pure comme prévu.
La question à se poser est, pourquoi avez-vous besoin de le déclarer pur virtuel si vous avez l'intention d'avoir une implémentation par défaut?
Ceci est gramatiquement refusé - le déclarateur qui peut inclure pur-spécificateurs , c'est-à-dire le membre-déclarateur, apparaît uniquement dans les déclarations qui ne sont pas des définitions. [classe.mem] :
membre-déclaration:
attribute-specifier-seqoptdecl-specifier-seqoptmember-declarator-listopt;
la fonction de définition
[...]membre de demande de déclaration-liste:
membre-déclaration de
membre-déclarateur-liste , membre-déclarantmembre de demande de déclaration:
déclaration de virt-spécificateur-seqoptpure-rédacteur de devisopt
déclaration de corset ou égal initialiseuropt
identificateuroptattribut spécificateur-seqopt:
constante de l'expression
La grammaire de function-definitionn'inclut pas un pur-spécificateur, [dcl.fct.def.général]:
la fonction de définition:
attribute-specifier-seqoptdecl-specifier-seqoptdeclarator virt-spécificateur-seqoptla fonction-corps
Vous pouvez certainement fournir un corps pour la fonction virtuelle pure. Cette fonction sera pointée par cette classe abstraite vtable. Sinon, le même emplacement pointera vers une fonction de trap spécifique au compilateur comme __cxa_pure_virtual
pour GCC. Il n'y a bien sûr rien à ce sujet dans la norme.