2009-04-06 11 views
3

J'écris du code où j'ai défini la classe de base suivante. Je veux utiliser cela comme une classe de base et ne pas faire quoi que ce soit avec lui-même. J'ai donc deux classes séparées qui sont dérivées de cette classe Chorus. Je voulais faire ceci pour fournir simplement quelques contraintes de base quant à ce que n'importe quelle classe de Chorus dérivée DOIT doit être considérée comme utilisable dans mon programme. Lorsque je compile mon projet (Visual Studio 2008), j'obtiens des erreurs de symboles externes non résolues sur toutes les fonctions virtuelles de cette classe Chorus. Je suppose que c'est l'erreur typique où je n'ai pas fait de déclarations avant de ces fonctions. Mais, étant donné qu'ils sont virtuels et que je ne veux pas qu'ils soient réellement définis pour faire quoi que ce soit tant qu'ils ne sont pas définis dans les classes dérivées, que puis-je faire pour résoudre ce problème?débutant C++: fonctions virtuelles dans une classe de base

Répondre

15

Si votre intention est pour eux d'être placer simplement des supports pour les classes d'enfants à mettre en œuvre, puis les rendre fonctions virtuelles pures en terminant avec = 0. Par exemple

virtual void destroyDelayBuffer(void) = 0; 

Cela rend la méthode « abstraite » si parler. Le compilateur C++ ne recherchera pas une définition réelle de la méthode mais forcera à la place toutes les classes dérivées à implémenter ces méthodes avant qu'une instance puisse être créée.

+1

Si proche! :) Bonne réponse. –

1

utiliser une fonction virtuelle pure:

virtual int callback(void *outputBuffer, void *notUsed, unsigned int 
     nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData) = 0; 
3

Vous devez déclarer les fonction virtuelle pure.

virtual void initializeDelayBuffer (vide) = 0;

Cela va créer une sorte d'interface, ce que vous voulez.

+0

D'accord, mais s'il vous plaît supprimer le vide de la liste des arguments; c'est C pas C++. –

2

Vous devez définir les fonctions que des fonctions virtuelles pures. Pour ce faire, ajoutez un "= 0" après chaque déclaration. Par exemple:

virtual void destroyDelayBuffer(void) = 0; 
1

Juste pour ajouter aux réponses ci-dessus, vous ne pouvez pas instancier un objet d'une classe contenant des fonctions virtuelles pures, à l'avenir si vous avez l'intention d'avoir des objets de votre classe de base, n'oubliez pas de faire la fonction non-pure virtuelle.

+0

Oui, c'est une classe de base dont on ne peut que dériver. Il n'y aura jamais d'objets parce que c'est trop squelettique pour faire quelque chose d'utile. – Rich