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