2016-04-01 3 views
0

Ich habe eine BaseClass und zwei Unterklassen erstellt: SubOne und SubTwo. Danach erstellte ich eine Sammlung namens MyCollection, die die Instanzen in einem Vektor speichert.Baseclass-Methode wird anstelle der in der Unterklasse

Sowohl die Basisklasse und die Subklassen haben die Methode getString. Die Basisklasse gibt base und die Unterklassen sub1 und sub2 zurück.

Ich bekomme keine Warnung oder Fehler während der Kompilierung. Aber aus irgendeinem Grund, wenn ich versuche, über den Vektor zu durchlaufen, kehren die Unterklassen „Basis“

#include <iostream> 
#include <vector> 

class BaseClass { 

    public: 

     BaseClass() {} 

     std::string getString() { 
      return "base"; 
     } 

}; 

class SubOne : public BaseClass { 

    public: 

     SubOne() : BaseClass() {} 

     std::string getString() { 
      return "sub1"; 
     } 

}; 

class SubTwo : public BaseClass { 

    public: 

     SubTwo() : BaseClass() {} 

     std::string getString() { 
      return "sub2"; 
     } 

}; 

class MyCollection { 

    private: 

     std::vector<BaseClass> instances; 

    public: 

     MyCollection() {} 


     void add(BaseClass & ins) { 
      instances.push_back(ins); 
     } 

     std::string printString() { 

      for(std::vector<BaseClass>::iterator it = instances.begin() ; it != instances.end(); ++it) { 
       std::cout << it->getString() << std::endl; 
      } 

     } 

}; 

int main() { 

    MyCollection *coll = new MyCollection(); 

    SubOne* s1 = new SubOne(); 
    SubTwo* s2 = new SubTwo(); 

    coll->add(*s1); 
    coll->add(*s2); 

    coll->printString(); 

    return 0; 

} 
+0

Mögliche Duplikat [Was Objekt Slicing ist?] (Http://stackoverflow.com/questions/274626/what-is-object-slicing) –

+0

Warum sollte nicht es? Ihre Funktion ist nicht virtuell. Und noch wichtiger ist, dass Ihr Vektor von "BaseClass" und nicht von "BaseClass &." Ist. –

+0

Es ist kein Duplikat –

Antwort

1

Sie haben vergessen, Stichwort virtual zu verwenden. Übersetzen Sie auch in Zeiger (Kredit geht an Kapitän Giraffe).

Siehe Code unten:

#include <iostream> 
#include <vector> 

class BaseClass { 

public: 

    BaseClass() {} 

    virtual std::string getString() { // BINGO _!_!_!_! 
     return "base"; 
    } 

}; 

class SubOne : public BaseClass { 

public: 

    SubOne() : BaseClass() {} 

    std::string getString() { 
     return "sub1"; 
    } 

}; 

class SubTwo : public BaseClass { 

public: 

    SubTwo() : BaseClass() {} 

    std::string getString() { 
     return "sub2"; 
    } 

}; 

class MyCollection { 

private: 

    std::vector<BaseClass*> instances; 

public: 

    MyCollection() {} 


    void add(BaseClass* ins) { 
     instances.push_back(ins); 
    } 

    std::string printString() { 

     for(std::vector<BaseClass*>::iterator it = instances.begin() ; it != instances.end(); ++it) { 
      std::cout << (*it)->getString() << std::endl; 
     } 

    } 

}; 

int main() { 

MyCollection *coll = new MyCollection(); 

SubOne* s1 = new SubOne(); 
SubTwo* s2 = new SubTwo(); 

coll->add(s1); 
coll->add(s2); 

coll->printString(); 

return 0; 

} 
+1

Sie haben Folgendes vermisst: 'std :: vector Instanzen;' Er schneidet. –

+0

Die BaseClass kann auch instanziiert werden, deshalb ist der 'getString' nicht virtuell –

+0

@IterAtor Das ist ein ungültiges Argument. Es gibt einen großen Unterschied zwischen rein virtuell und virtuell. –

Verwandte Themen