У меня возникли проблемы с использованием виртуальных функций с объявленными объектами с использованием времени автоматического хранения. Вот воспроизводимый сценарий:Виртуальные функции с автоматическим временем хранения не работают
#include <iostream>
class A {
public:
A() {}
virtual ~A() {}
virtual void printClassName() {
std::cout << "A" << std::endl;
}
};
class B : public A {
public:
B() : A() {}
~B() {}
void printClassName() {
std::cout << "B" << std::endl;
}
};
class Test {
private:
A item;
public:
Test() {}
~Test() {}
void setItem(A item) {
this->item = item;
}
A getItem() {
return this->item;
}
};
int main() {
Test t;
B item;
t.setItem(item);
t.getItem().printClassName();
return 0;
}
Это печатает «А», в то время как я ожидал бы его для печати B. Мне любопытно, почему.
Спасибо заранее!
Убедитесь, что все базовые классы, не связанные с листом, являются абстрактными. В противном случае работать с классами очень сложно. –
Это может быть полезно прочитать: http://stackoverflow.com/questions/274626/what-is-object-slicing – NPE
@KerrekSB Я попытался сделать 'printClassName()' чисто виртуальным, но это приводит к ошибке компиляции в строке 21 then: 'error: тип поля« A »- абстрактный класс». –