Rebonsoir,
Tout d'abord j'ai fait très peu de C++, et ça fait longtemps.
Cependant, ce que je dois dire sur ton code :
- les méthodes spécifiques à chaque classe ne doivent pas être écrites dans ta classe abstraite "cases"
- virtual te permet de définir les méthodes qui pourront être utilisées par polymorphisme, et le =0 signifie que ta fonction n'a pas d'implémentation. Dans ton cas, tu n'as qu'une méthode qui est =0, donc tu as une classe abstraite et non une interface. Pour avoir une interface, il faut que toutes tes méthodes soit =0 (mais dans ton cas je trouve qu'il faut garder une classe abstraite).
Ici ton compilateur te dit que ta classe "cImpot" est une classe abstraite. En effet, "cImpot" étend ta classe abstraite "cases", qui définit une méthode =0, donc tu est obligé de fournir une implémentation à cette méthode dans ta classe "cImpot", sinon elle est elle-même considérée comme une classe abstraite (certaines méthodes sont implémentées, d'autres non), et elle ne peut pas être instanciée.
Voici un exemple de code pour t'expliquer un peu mieux :
class maClasseAbstraite {
//pas de constructeur car pas instanciable
virtual int methode1();
virtual int methode2();
};
class maClasseFille : public maClasseAbstraite {
//les constructeurs
maClasseFille(int att1, string att2);
...
//les méthodes surchargées, ici juste methode2
virtual int methode2();
//les méthodes spécifiques à ta classe
int methode3();
};
int main() {
/*comme dans ton code, on manipule les objets filles par le biais des objets (interface ou classe abstraite) dont ils héritent, et grâce au mot clé virtual, les méthodes appelées sont celles de objets contenus, et non pas des objets conteneurs*/
maClasseAbstraite * conteneur = new maClasseFille(1,"toto");
// ensuite essaie ça (je ne sais pas si ça marche mais il faut chercher de ce côté là)
((maClasseFille) conteneur).methode3();
}