33. Чей метод вызовется, если массив имеет тип класса-родителя, а внутри лежат экземпляры наследников?Код

class Shape { func draw() { print("shape") } } class Circle: Shape { override func draw() { print("circle") } } class Square: Shape { override func draw() { print("square") } } let shapes: [Shape] = [Circle(), Square()] for shape in shapes { shape.draw() }

Дополнительные вопросы

1. Как называется такая возможность языка?

Темы

В консоли будет circle, затем square. Тип массива Shape, но draw() переопределён. Вызов идёт по фактическому экземпляру, а не по типу переменной.

Дополнительные вопросы

1. Полиморфизм. Для класса это динамическая диспетчеризация: адрес draw() берётся из таблицы методов конкретного экземпляра.