Полиморфизм работает только на указатели и ссылки. Если вы присваиваете B
для A
, оно становится A
, и вы теряете всю специфичную для B
информацию, включая переопределения методов. Это называется "нарезка"; B
части "отрезаются" от объекта, когда он назначается объекту родительского класса.
С другой стороны, если вы присваиваете B*
для A*
, оно выглядит как A*
, но все еще действительно указывает на B
, и поэтому 1016 * -специфическая информация остается, и виртуальные переопределения B
будут использоваться.
Попробуйте:
int main(){
A* ab = new B();
ab->print();
delete ab;
while(true){}
}
То же самое относится и к присвоению B
для A&
(ссылка на A
), например,
int main(){
B b;
A& ab = b;
ab.print();
while(true){}
}