J'ai vu plusieurs réponses pour ce genre de problème mais je ne comprends pas comment le résoudre. Le problème principal est probablement que je travaille sur le code de quelqu'un d'autre, mais mec. Voici un échantillon réduit pour ce problème: J'ai une classe qui relie de nombreuses autres classes:Impossible de déclarer une variable de type abstrait car les fonctions virtuelles sont pures - avec héritage multiple
class Interface
: public system_atoms,
public system_io,
/* etc, others */
{
/* A few functions, none that matters here - none from the inherited classes redefined */
}
system_atoms intérieur, je:
class system_atoms {
public:
virtual int init_atom(int atom_number) = 0;
virtual int check_atom_id(int atom_number) = 0;
}
Et j'ai une classe qui doit hériter de l'interface :
class Interface_proxy : public Interface {
public:
/* stuff - no function from the inherited classes redefined */
}
Dans le cpp:
Interface_proxy global_interface_proxy;
La compilation apporte une erreur indiquant "Impossible de déclarer la variable global_interface_proxy
comme étant de type abstrait Interface_proxy
car les fonctions virtuelles [les deux répertoriées dans system_atoms] sont". Je ne suis pas très compétent en C++ non plus. Je devine que je devrais redéfinir les deux fonctions virtuelles comme pure (la même sans le = 0
et le droit virtual
?) Quelque part afin que la variable ne soit pas de type abstrait. Mais mes connaissances s'arrêtent là - et l'héritage multiple me trouble.
Vous ne pouvez pas créer une instance d'une classe si cette classe a des méthodes virtuelles pures. C'est ce qu'on appelle une classe abstraite. Toutes les classes dérivées doivent implémenter ces méthodes ou elles seront abstraites aussi. –
Même sans l'héritage multiple, vous obtiendrez la même erreur. Si vous voulez déclarer une 'Interface_proxy', il faudra que ce soit un pointeur ou une référence, et ensuite vous devrez pointer vers ou renvoyer vers un non-abstrait réel (par exemple Interface_proxy) qui implémente le fns pur. – doctorlove