2017-07-06 1 views
0

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.

+1

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. –

+0

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

Répondre

4

Une fonction pure virtual function est une fonction virtuelle qui n'a explicitement pas d'implémentation (indiquée par le = 0 de fin). Une fonction virtuelle pure est destinée à forcer les classes dérivées à fournir leur propre implémentation pour cette fonction. En d'autres termes, une classe dérivée devrait éventuellement définir son propre comportement pour cette fonction. Une classe abstraite est une classe qui possède une ou plusieurs fonctions virtuelles pures, soit parce qu'elle en déclare au moins une soit qu'elle hérite d'une classe abstraite et qu'elle ne remplace pas toutes les fonctions virtuelles pures héritées. Ces classes ne peuvent pas être instanciées (vous ne pouvez pas en créer une instance) car leur comportement n'est pas complètement défini. Ils ne peuvent être utilisés que comme classes de base pour d'autres types.

Dans votre cas, system_atoms définit 2 fonctions virtuelles pures, c'est donc une classe abstraite. Chacune des classes héritées de system_atoms est également abstraite car elles héritent toutes de ces fonctions virtuelles pures et ne les remplacent jamais.

La solution correcte consiste à fournir une implémentation pour ces fonctions virtuelles pures dans votre classe dérivée en remplaçant.

Voir le virtual functions et le .

L'héritage multiple n'intervient pas ici, sauf que chaque classe héritée peut avoir ses propres fonctions virtuelles pures. Remplacez simplement les fonctions virtuelles pures normalement.

+0

Merci. Si j'ai bien compris, j'ai donc besoin de surcharger ces deux fonctions dans Interface_proxy, quelque chose comme 'int init_atom (int atom_number) override;'. – Marlon

+0

@Marlon Oui, et pour 'check_atom_id'. Et puis vous devez les mettre en œuvre. Vous devrez peut-être réfléchir sur le comportement approprié de ces méthodes pour votre cas. –

+0

meilleure réponse jamais – rimiro