Я создал BaseClass
и два подкласса: SubOne
и SubTwo
. После этого я создал коллекцию под названием MyCollection
, которая хранит экземпляры в векторе.Вызывается метод Baseclass вместо одного в подклассе
Как базовый класс, так и подклассы имеют метод getString
. Возврат базового класса с base
, а подклассы - sub1
и sub2
.
Во время компиляции я не получаю никаких предупреждений или ошибок. Но по какой-то причине, если я пытаюсь перебрать вектор, подклассы возвращают «базовый»
#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;
}
Возможный дубликат [Что такое объект нарезка?] (Http://stackoverflow.com/questions/274626/what-is-object-slicing) –
Почему бы не Это? Ваша функция не является виртуальной. И что более важно, ваш вектор имеет значение «BaseClass», а не «BaseClass &». Так что вы нарезаете. –
это не дубликат –