Ceci est ma situation:Erreur lors de la substitution C++ fonction virtuelle
class Filter3by3 {
public:
virtual inline Mat convolution((Mat & mat, int i, int j, int rows, int cols) {
code
}
};
class MySobel: public Filter3by3 {
public:
inline Vec3b convolution(Mat & mat, int i, int j, int rows, int cols) {
code
}
};
Maintenant, quand je l'appelle:
Filter3by3 f = choose_filter(filtername); // Returns a Sobel filter
Mat mat;
s.convolution(args);
La méthode de classe de base est appelée. Je suis assez novice en ce qui concerne les règles de reliure de la méthode C++, alors pouvez-vous me dire où je me trompe? J'apprécie votre aide.
MISE À JOUR Il semble que même avec convolution Mat en ligne virtuelle ((mat Mat &, i, int j, les lignes int, int CLO) Il ne fonctionne pas.
C'est une course programme compilé avec g ++ std = C++ 11
#include <iostream>
using namespace std;
class Filter {
public:
Filter() { }
virtual int ehi() {
cout << "1" << endl;
return 1;
}
};
class SubFilter : public Filter {
public:
SubFilter() : Filter() { }
int ehi() {
cout << "2" << endl;
return 2;
}
};
Filter choose_filter(){
SubFilter f;
return f;
}
int main(int argc, char* argv[]) {
Filter f = choose_filter();
f.ehi();
return 0;
}
il imprime 1 au lieu de 2. J'ai utilisé virtuel pour assurer la liaison dynamique, mais il ne semble pas être assez, aussi avec mot-clé « prioritaire ».
Pour remplacer une fonction, vous devez avoir la signature exacte de la classe de base. Puisque vous changez le type de retour, vous ne surchargez pas la fonction de classe de base. Cependant, avec le code que vous montrez, la fonction correcte doit être appelée. Est-ce copier-coller à partir de votre code * réel *? Pouvez-vous s'il vous plaît essayer de créer un [Exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) et nous montrer. –
En ce qui concerne votre édition, appelez-vous la fonction virtuelle sur 'f' ou' s'? Qu'est-ce que 's'? Et si c'est vraiment 'f' alors vous devriez probablement lire sur [* object slicing *] (http://stackoverflow.com/questions/274626/what-is-object-slicing). –
Polymorphisme fonctionne uniquement en utilisant des pointeurs ou des références à la classe de base. Vous avez un découpage d'objet. –