Ваш bar
не указывает ни на что, так как он не указывает на int
, вы не можете присвоить значение его int
(*bar = 10
= segfault). Добавьте конструктор к A
, который исправит это:
class A {
protected:
A() { // <- Constructor
bar = new int(0);
}
A(const A& other) // <- Copy sonstructor
{
bar = new int(*other.bar);
}
A& operator=(A other) // Assignment operator
{
std::swap(bar, other.bar);
return *this;
}
virtual ~A() { // <- Destructor
delete bar;
}
virtual void foo() {}
int* bar = nullptr;
public:
void eval() {
foo();
std::cout << *bar;
}
};
Тогда весь остальной код будет работать, и eval()
напечатает 10
, как и предполагалось. Обратите внимание, добавление деструктора для очистки bar
позже необходимо для предотвращения утечек памяти.
Редактировать:
Как очень правильно указал MikeCAT, я был оченьслишком поспешный и нарушил правило трех в моем ответе. Если вы делаете динамическое размещение, вам понадобятся и деструктор, и конструктор копирования, и оператор присваивания. Я добавил их в код выше.