«Конечно, до тех пор, пока вы выделяете память в куче», - где выделенная память не имеет к этому никакого отношения. Это все о семантике. Возьмем, например:
Derived d;
Base* b = &d;
d
находится в стеке (автоматическая память), но полиморфизм будет по-прежнему работать на b
.
Если у вас нет указатель базового класса или ссылка на производный класс, полиморфизм не работает, потому что у вас больше нет производного класса. Take
Base c = Derived();
Объект c
не является Derived
, а Base
из-за нарезки. Итак, технически, полиморфизм все еще работает, просто у вас больше нет объекта Derived
.
Теперь возьмите
Base* c = new Derived();
c
, просто указывая на некоторые место в памяти, и вам все равно, действительно ли это Base
или Derived
, но вызов метода virtual
будет разрешен динамически.