Нарезка
Предположим, что класс D является производным от класса C. Мы можем думать о D как о классе C с некоторыми дополнительнымиданные и методы.С точки зрения данных, D имеет все данные, которые имеет C, и, возможно, больше.С точки зрения методов, D не может скрыть какие-либо методы C и может иметь дополнительные методы.С точки зрения существующих методов C, единственное, что может сделать D, это переопределить их своими собственными версиями.
Если x является объектом класса D, то мы можем нарезать x по отношению к C,отбросить все расширения, которые сделали xa D, и оставить только часть C.Результатом среза всегда является объект класса C.
нарезка http://webdocs.cs.ualberta.ca/~hoover/Courses/201/201-New-Notes/lectures/slides/slice/slide1.gif
Принцип разработки: Нарезка объекта по отношению к родительскому классу C должна по-прежнемусоздайте правильно сформированный объект класса C.
Предупреждение об использовании: Даже если D - это C, вы должны быть осторожны.Если у вас есть тип аргумента, который является C, и вы предоставляете D, он будет разрезан, если вы делаете вызов по значению, указателю или ссылке.См. Пример ниже.
Примечание по виртуальным функциям.Их подписи используются для определения того, какой из них выполнять.
Следите за оператором sliced =, он может сделать lhs непоследовательным.Кроме того, оператор = никогда не является виртуальным, это не имеет смысла.Например, предположим, что оба класса A, B являются подклассами класса C. То, что A является C, а B является C, не означает, что вы можете назначить объект B объекту A.Без информации о типе во время выполнения вы не можете сделать безопасное назначение.