"Surely so long as you allocate memory on the heap" - where the memory is allocated has nothing to do with it. It's all about the semantics. Take, for instance:
Derived d;
Base* b = &d;
d
is on the stack (automatic memory), but polymorphism will still work on b
.
If you don't have a base class pointer or reference to a derived class, polymorphism doesn't work because you no longer have a derived class. Take
Base c = Derived();
The c
object isn't a Derived
, but a Base
, because of slicing. So, technically, polymorphism still works, it's just that you no longer have a Derived
object to talk about.
Now take
Base* c = new Derived();
c
just points to some place in memory, and you don't really care whether that's actually a Base
or a Derived
, but the call to a virtual
method will be resolved dynamically.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…