Ваш пример кода вообще не включает нарезку.Все, что вы сделали, это применили базовый полиморфизм.Объявляя Base::display()
как virtual
и вызывая display()
для Base *
, вы попросили его динамически вызывать функцию-член в типе фактического объекта, на который указывает, который являетсяDerived
.Переменные-члены Derived
находятся в области действия Derived::display()
, поэтому они компилируются и работают.
Однако вы можете напрямую обращаться только к переменным-членам (или функциям), объявленным в Base через указатель на Base
.Вот почему varBase->iDerived
не компилируется.
Слайс обычно включает в себя что-то эквивалентное:
Derived d;
Base b = (Base)d;
Путем явного присвоения / инициализации объекта Base
, все Derived
-специфичныечлены будут потеряны (то есть они были «вырезаны»).
Этот материал относительно фундаментален;Я бы предложил подобрать приличную книгу по C ++.Здесь есть список хороших: Руководство к книге по C ++ и список .