2012-03-26 4 views
-1

J'ai une classe de base:C classe de base abstraite appelant propres résultats de fonction virtuelle pure dans "référence non définie"

class Foo { 
    public: 
     virtual ~Foo() {} 
     static void printFoos() 
     { 
      std::vector<Foo*>::iterator it; 
      for(it=fooList.begin();it!=fooList.end();++it) 
      { 
       std::cout<<"Class: "<<(*it)->getClassName()<<"\n"; 
      } 
     } 
     virtual const char* getClassName()=0; 
     static std::vector<Foo*> fooList; 
}; 

Et quelques classes dérivées, par exemple donné:

class Bar : public Foo { 
    public: 
     Bar(); 
    private: 
     const char* getClassName() 
     { 
      return "Bar"; 
     } 
}; 

Le code ci-dessus donne "une référence indéfinie à Foo :: getClassName()" que Im suppose parce que le code veut appeler Foo :: getClassName(), mais comment l'obtenir pour appeler la fonction comme un appel virtuel normalement? C'EST À DIRE. Comment l'obtenir pour appeler Bar :: getClassName() à partir de Foo?

EDIT: l'héritage oublié thingy

+0

Où est le code appelant? Pouvez-vous coller cela? – Sid

+1

Aussi Bar ne dérive pas de Foo au moins dans votre code ci-dessus. – Sid

+1

Si vous déclarez getClassName en tant que public dans la classe Base, ne devrait-il pas également être public dans la classe Derived? –

Répondre

0

Il semble bar ne hérite foo. Vous devez déclarer l'héritage:

class bar: public foo { ... 
+0

C'est une faute de frappe. Désolé, j'ai tapé l'exemple. – Brian

+0

@Brian - vous devriez toujours copier/coller. – WeaselFox

0

articles dans fooList doivent être créés avec new, fooList[0] = new Bar(). Et Bar doit hériter de Foo, comme l'a dit WeaselFox.

0

Il y a deux choses qui sont indéfinis:

Bar::Bar() is undefined 

- Bar(); 
+ Bar() {} 

et fooList est non défini:

+std::vector<Foo*> Foo::fooList; 

programme est corrigé ici:

test.cpp:

#include <vector> 
#include <iostream> 

class Foo { 
    public: 
     virtual ~Foo() {} 
     static void printFoos() 
     { 
      std::vector<Foo*>::iterator it; 
      for(it=fooList.begin();it!=fooList.end();++it) 
      { 
       std::cout<<"Class: "<<(*it)->getClassName()<<"\n"; 
      } 
     } 
     virtual const char* getClassName()=0; 
     static std::vector<Foo*> fooList; 
}; 

std::vector<Foo*> Foo::fooList; 

class Bar : public Foo { 
    public: 
     Bar() {}; 
    private: 
     const char* getClassName() 
     { 
      return "Bar"; 
     } 
}; 

int main() 
{ 
    //intentionally leaked 
    Foo::fooList.push_back(new Bar()); 
    Foo::fooList.push_back(new Bar()); 
    Foo::fooList.push_back(new Bar()); 

    Foo::printFoos(); 
} 

sortie:

Class: Bar 
Class: Bar 
Class: Bar 
Questions connexes