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;
}
Mögliche Duplikat [Was Objekt Slicing ist?] (Http://stackoverflow.com/questions/274626/what-is-object-slicing) –
Warum sollte nicht es? Ihre Funktion ist nicht virtuell. Und noch wichtiger ist, dass Ihr Vektor von "BaseClass" und nicht von "BaseClass &." Ist. –
Es ist kein Duplikat –