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