Что определяет выбор виртуальной функции при обращении? 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Что определяет выбор виртуальной функции при обращении?



Полиморфизм

Что определяет выбор виртуальной функции при обращении?

 

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

 

Какие функции не могут быть объявлены виртуальными?

 

Конструкторы не могут быть объявлены виртуальными, они выполняются прежде, чем объект будет создан полностью, т. е. во время работы конструктора динамический тип объекта ещё не завершён.

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

Так же виртуальными не могут быть функции не члены классов и статическая функция.

 

Когда необходим виртуальный деструктор?

 

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

 

Можно ли создавать объекты абстрактных классов?

 

Нет, нельзя, в этом и есть их смысл.

 

Когда адрес виртуальной и невиртуальной функции связывается с кодом ее реализации?

Виртуальной во время выполнения проги, невиртуальной во время компиляции.

 

 

Что должно совпадать и может различаться у виртуальных функций в базовом и производном классах?

 

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

 

Что происходит, если виртуальная функция базового класса не объявлена в производном классе?

 

Будет использоваться определение виртуальной функции базового класса.

 

Что будет, если для виртуальной функции базового класса в производном классе изменены типы или число аргументов?

Будет осуществляться статический полиморфизм, т. е. теряется виртуальная природа функции, она становится перегружаемой.

 

Что будет, если для виртуальной функции базового класса в производном классе изменён тип возврата?

 

Возможны 2 варианта. Первый, если возвращаемое значение ссылка или указатель на класс, который сам является базовым, и оно меняется на на ссылку или указатель на класс, который является открытым и производным от класса, возвращаемого функцией базового класса, то ничего не будет, т. е. функция останется виртуальной. Второй, если возвращаемые значения отличаются от описанного в первом пункте, то виртуальная функция становится обычной перегруженной.

 

Полиморфизм

Что определяет выбор виртуальной функции при обращении?

 

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

 



Поделиться:


Последнее изменение этой страницы: 2016-12-10; просмотров: 117; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.21.104.109 (0.006 с.)