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