Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

вопросы_13

.docx
Скачиваний:
0
Добавлен:
28.12.2024
Размер:
19.99 Кб
Скачать

Контрольные вопросы к лекции №13

  1. В чем заключается отличие раннего (статического) и позднего (динамического) связывания?

  2. В каком случае обращаются к механизму виртуальных методов?

  3. В чем отличие обычных и виртуальных методов?

  4. Как распространяется механизм виртуальности методов по дереву наследования? Где начало и конец виртуальности?

  5. Что такое чистый метод?

  6. Какой класс является абстрактным?

  7. Как распространяется абстрактность классов по дереву наследования?

  8. Могут ли у абстрактного класса быть атрибуты и в чем их смысл, если они могут задаваться?

  1. Раннее (статическое) связывание происходит на этапе компиляции программы. Когда код компилируется, компилятор определяет, какую функцию или метод нужно вызывать на основе типа объекта, на который ссылается переменная или указатель. Если тип объекта известен на этапе компиляции, то компилятор выбирает соответствующую функцию или метод, и связывание происходит на этапе компиляции. Это означает, что конкретная версия функции или метода выбирается заранее, до того, как программа начнет выполняться. Раннее связывание обычно работает быстрее, чем позднее, потому что выбор функции или метода происходит заранее.

Позднее (динамическое) связывание, наоборот, происходит во время выполнения программы. Компилятор не может определить, какую функцию или метод нужно вызывать, потому что тип объекта, на который ссылается переменная или указатель, не известен на этапе компиляции. Вместо этого, выбор функции или метода происходит на основе фактического типа объекта, на который ссылается переменная или указатель, во время выполнения программы. Это позволяет использовать полиморфизм и динамическое связывание, что делает код более гибким и расширяемым.

  1. Механизм виртуальных методов применяется в случаях, когда у производного класса есть методы с теми же именами, что и у его базового класса, и необходимо определить, какая версия метода будет вызвана при работе с объектом производного класса через указатель или ссылку на базовый класс. При вызове виртуального метода через указатель или ссылку на базовый класс происходит динамическое связывание, которое позволяет выбрать версию метода из производного класса, а не базового класса, если такая версия метода существует. Это делает возможным

правильное выполнение методов, даже если объект приведен к указателю базового класса.

  1. Обычные методы (non-virtual methods) и виртуальные методы (virtual methods) - это разные типы методов в объектно-ориентированном программировании. Основное отличие между ними заключается в том, что виртуальные методы могут быть переопределены в производных классах, тогда как обычные методы нет. Обычные методы выбираются на этапе компиляции, что делает их статически связанными, в то время как виртуальные методы выбираются динамически во время выполнения программы, основываясь на фактическом типе объекта. Это делает виртуальные методы полезными для реализации полиморфизма, поскольку они позволяют объектам разных классов вызывать методы с одинаковыми именами, но разной реализацией.

  2. Механизм виртуальности методов в С++ простирается по всему дереву наследования, начиная с базового класса и до его производных классов. Когда метод объявлен виртуальным в базовом классе, все производные классы наследуют этот метод в виртуальном состоянии. Это означает, что методы в производных классах, которые переопределяют этот метод, также должны быть объявлены виртуальными. Если метод в производном классе не объявлен виртуальным, то он скрывает виртуальный метод базового класса с тем же именем, а не переопределяет его. Виртуальность метода начинается в базовом классе и распространяется на все производные классы, которые переопределяют этот метод, пока не будет скрыт или переопределен не виртуальным методом в производном классе.

  3. Чистый метод (pure virtual method) - это виртуальный метод в базовом классе, который не имеет определения (тела метода) и должен быть переопределен в производных классах. Он объявляется с помощью специального синтаксиса "= 0" в конце объявления метода. Использование чистых виртуальных методов позволяет создавать абстрактные классы, которые определяют только интерфейс, а конкретная реализация остается на уровне производных классов. Абстрактные классы не могут быть использованы для создания объектов, но могут служить в качестве шаблонов для производных классов, которые реализуют их методы.

  4. Абстрактный класс - это класс, который содержит один или более чистых виртуальных методов и не имеет определения для этих методов. Такие классы нельзя использовать для создания объектов, но они могут быть использованы в качестве базовых классов для производных классов. Абстрактные классы определяют интерфейс, который должны реализовать производные классы, обеспечивая единообразие в работе с ними.

  5. Абстрактность классов может быть унаследована от базового класса к производному классу в дереве наследования. Если базовый класс является абстрактным, то все его производные классы также должны реализовать все его чистые виртуальные методы или они также будут абстрактными.

Например, если базовый класс определяет интерфейс для геометрических фигур и содержит методы для вычисления площади и отрисовки, то все его производные классы, такие как Circle и Rectangle, должны реализовать эти методы. В противном случае производный класс также становится абстрактным и не может быть использован для создания объектов.

  1. У абстрактного класса могут быть атрибуты, так же как и у обычных классов. Атрибуты определяют состояние объекта, но абстрактный класс не может быть создан в виде объекта, поэтому его атрибуты могут быть использованы только в контексте производных классов, которые реализуют все абстрактные методы. Атрибуты абстрактного класса могут иметь значения по умолчанию или задаваться при создании объекта производного класса. Их смысл может быть различным и зависеть от конкретной задачи и реализации класса. Например, абстрактный класс, представляющий геометрическую фигуру, может иметь атрибуты, такие как цвет, координаты центра и т. д., которые могут быть общими для всех его производных классов.

Соседние файлы в предмете Объектно ориентированное программирование