Это не вызов print базового класса, это вызов производного класса print (я класс B) для вашего последнего вызова, который является правильным поведением, потому что указатели и ссылки работают с полиморфизмом.
ЕслиВы нарезали свой объект, затем вызвали печать, это действительно напечатало бы версию А.Вы не хотите этого делать, и, к счастью, вы этого не сделали.
Это будет нарезка:
B b;
A a(b);
A a2;
a2 = b;
A& a3 = b;
b.print();
a.print();
a2.print();
a3.print();
, и вы должны получить:
Якласс BI - базовый класс. Я - базовый класс. Я - класс B
, поскольку a
и a2
оба являются объектами типа a, даже если вы присвоили их b.Нарезка не рекомендуется, но это распространенная ошибка.
a3, однако, является ссылкой на объект типа A или одно из его производных, но на самом деле является объектом b типа B и сохраняет полиморфное поведение.