Объект производного класса, переданный значением, чтобы функционировать с параметром базового класса
Объектное разрезание происходит, когда вы передаете объект производного класса значением к функции, но функция ожидает объект базового класса как параметр.
Если вы передадите объект производного класса значением к функции, вы ожидаете, что производный класс копирует конструктора, чтобы быть названным. Если функция ожидает объект базового класса как параметр:
Конструктор копии базового класса называется.
В теле функции параметр рассматривается как объект базового класса.
На C++ методы virtual
класса разрешены во время выполнения согласно фактическому типу объекта. Из-за объектного разрезания может быть названа неправильная реализация метода virtual
. Например, базовый класс содержит метод virtual
, и производный класс содержит реализацию того метода. Когда вы вызываете метод virtual
от тела функции, метод базового класса называется, даже при том, что вы передаете объект производного класса функции.
Одна возможная фиксация должна передать объект ссылкой или указателем. Передача ссылкой или указателем не вызывает вызов конструкторов копии. Если вы не хотите, чтобы объект был изменен, используйте спецификатор const
со своим параметром функции.
Другой возможная фиксация должна перегрузить функцию с другой функцией, которая принимает объект производного класса как параметр.
Группа: Объектно-ориентированный |
Язык: C++ |
Значение по умолчанию: на |
Синтаксис командной строки: OBJECT_SLICING |
Влияние: высоко |