2010-01-20 4 views
2

J'ai un fichier d'en-tête qui utilise une fonction virtuelle.Redéfinir les fonctions virtuelles entre les fichiers d'en-tête en C++

Ceci est déclaré et défini:

#ifndef HeaderH 
#define HeaderH 

class Base { 
<some code> 
public:virtual int checkVal(int& val) { return val;} 
}; 
#endif 

J'ai un autre fichier d'en-tête qui déclare certaines fonctions, et hérite de cet en-tête de base.

Enfin, j'ai l'implémentation de ce fichier d'en-tête dans un autre fichier .cpp: Je souhaite surcharger la fonction virtuelle checkVal dans mon implémentation ici, mais j'obtiens toujours une erreur de redéfinition.

int Base::checkVal(int& value) 
{ 
    if(value == 0) 
     value = 10; 
    return value; 
} 

Y a-t-il quelque chose que je devrais inclure dans mon fichier d'en-tête qui remplacera la fonction virtuelle de base?

+0

Je pense que lorsque vous dites que vous voulez remplacer la base, vous voulez créer une implémentation spécifique pour votre classe enfant (celle définie dans le deuxième en-tête) changez en int Child :: check (...) –

Répondre

2

Vous avez déjà fourni la définition de checkval() dans votre classe de base, alors pourquoi la redéfinissez-vous? Vous pouvez le définir une seule fois. Si vous voulez donner l'implémentation dans le fichier .cpp, déclarez checkval() dans la classe de base, inutile de le définir ici.

Votre implémentation de checkval() échoue si vous l'appelez comme ce qui suit:

Base b; 
//some code 
b.checkval(10);//Error because temporaries cannot be bound to non-constant references 

Y at-il quelque chose que je dois inclure dans mon dossier d'en-tête qui remplacera la fonction virtuelle de base?

créer une classe dérivée dans le fichier d'en-tête et substituer checkval() puis en déclarant la fonction à l'intérieur de la classe dérivée et définissant à l'intérieur de fichier .cpp.

+0

J'ai plusieurs classes qui utilisent le fichier Base Header, j'ai donc besoin de la définition de cette fonction ici. Partout ailleurs et cela signifierait une énorme refonte pour mettre à jour toutes les classes héritées. Mon code fonctionne comme Base.h <- Another.h <- Class.cpp. Pour cette classe, j'ai besoin de remplacer la fonctionnalité de la fonction Base.h standard, donc je l'ai rendu virtuel pour le remplacer dans le fichier .cpp. Est-ce possible? – donalmg

+0

Overriding signifie redéfinir une fonction (même signature) dans la classe dérivée. Créez une classe dérivée et redéfinissez 'checkval()' à l'intérieur. –

1

Je ne pense pas que vous vouliez passer outre. Et votre implémentation manque un type de retour - il devrait être:

int Base::checkVal(int& value) 
+0

Excuses, Je coupe ceci hors du code. J'ai le type de retour ci-dessus .. – donalmg

+0

Il serait utile si vous avez posté le code complet illustrant ce que vous demandez. –

1

Vous avez deux implémentations dans votre classe de base, l'un dans le fichier d'en-tête, l'autre dans le fichier .cpp. Juste omettre celui dans le fichier d'en-tête.

2

Vous avez défini la fonction comme { return val;} dans le fichier d'en-tête, vous ne pouvez pas définir aussi comme

{ 
    if(value == 0) 
     value = 10; 
    return value; 
} 

partout ailleurs dans votre programme. Il ne peut avoir qu'une définition. Il se peut que vous vouliez dire que la deuxième définition était pour une classe dérivée (et non Base), mais ce n'est pas ce que vous avez dans votre code. Le fait que votre question n'utilise pas le mot class me dit que vous pourriez être confus sur le fonctionnement des fonctions virtuelles. Lisez-en quelques-uns, il devrait être assez évident comment définir une fonction virtuelle dans une classe dérivée. Il devrait ressembler à Derived::checkVal(int & value). Notez l'utilisation de "Derived" comme nom de classe au lieu de "Base".

+1

J'ai plusieurs classes qui utilisent le fichier Base Header, j'ai donc besoin de la définition de cette fonction ici. Partout ailleurs et cela signifierait une énorme refonte pour mettre à jour toutes les classes héritées. Mon code fonctionne comme Base.h <- Another.h <- Class.cpp. Pour cette classe, j'ai besoin de remplacer la fonctionnalité de la fonction Base.h standard, donc je l'ai rendu virtuel pour le remplacer dans le .cpp. Est-ce possible? J'espère que cela efface toute confusion. – donalmg

3

xxx.h

#ifndef HeaderH 
#define HeaderH 

class Base { 
    virtual int checkVal(int& val); // no definition 
}; 
#endif 

xxx.cpp

#include "xxx.h" 

int Base::checkVal(int& value) 
{ 
    if (value == 0) 
     value = 10; 
    return value; 
} 

Et cela fonctionne très bien. Sinon, le compilateur ne saura pas quelle définition utiliser. Il ne peut y en avoir qu'un!

1

L'erreur est exactement ce que vous devriez obtenir.

Sans créer une nouvelle classe héritant de Base, vous ne pouvez pas redéfinir la fonction.

#ifndef DERIVED_H 
#define DERIVED_H 

#include "base.h" 

class Derived : public Base{ 
<some code> 
public: 
    virtual int checkVal(int& val) 
    { 
     if(value == 0) 
      value = 10; 
     return value; 
    } 
}; 
#endif DERIVED_H 

Ensuite, utilisez Derived où vous allez utiliser Base. Veuillez lire le Friendship and Inheritance.

Questions connexes