Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

R.10.2 Виртуальные функции





Если класс base содержит виртуальную ($$R.7.1.2) функцию vf, апроизводный от него класс derived также содержит функцию vf тогоже типа, тогда вызов vf для объекта класса derived являетсяобращением к derived::vf, даже если доступ к этой функции происходитчерез указатель или ссылку на класс base. Говорят, что функцияпроизводного класса подавляет функцию базового класса. Однако, еслитипы функций ($$R.8.2.5) различны, функции считаются разными и механизмвиртуальности не действует (см. также $$R.13.1). Считается ошибкой,если функция производного класса отличается от виртуальной функциибазового класса только типом возвращаемого значения. Рассмотримпример: struct base { virtual void vf1(); virtual void vf2(); virtual void vf3(); void f(); }; class derived: public base { public: void vf1(); void vf2(int); // скрывает base::vf2() char vf3(); // ошибка: различие только в типе // возвращаемого значения } void g() { derived d; base* bp = &d; // стандартное преобразование: derived* в base* bp->vf1(); // вызов derived::vf1 bp->vf2(); // вызов base::vf2 bp->f(); // вызов base::f } Здесь три вызова для объекта d класса derived приведут к обращениям кderived::vf1, base::vf2 и base::f соответственно. Иными словами,интерпретация вызова виртуальной функции зависит от типа объекта,для которого она вызывается, тогда как интерпретация вызованевиртуальной функции-члена зависит только от типа указателя илиссылки на этот объект. Например, выражение bp->vf1()приведет к вызову derived::vf1(), поскольку bp указывает на объекткласса derived, в котором функция derived::vf1() подавляетвиртуальную функцию base::vf1(). Наличие спецификации virtual означает, что функция является членом,поэтому виртуальная функция не может быть глобальной функцией (не членом)($$R.7.1.2). Точно так же виртуальная функция не может бытьстатическим членом, т.к. для вызова виртуальной функции необходимоналичие определенного объекта, который указывает, какую функциюнадо вызывать. В другом классе виртуальную функцию можно описать какдруга. Функция, подавляющая виртуальную, сама считается виртуальнойфункцией. Спецификацию virtual можно использовать для подавляющейфункции производного класса, но это избыточно. Виртуальная функцияможет быть определена или описана в базовом классе как чистая($$R.10.3). Виртуальную функцию, которая определена в базовом классе,не нужно определять в производном классе: при всех вызовах будетиспользоваться функция, определенная в базовом классе. Механизм виртуальности при вызове отключается, если есть явноеуточнение имени с помощью оператора разрешения области видимости ($$R.5.1), например: class B { public: virtual void f(); }; class D: public B { public: void f(); }; void D::f() { /*... */ B::f(); } Здесь обращение к f из D приводит к вызову B::f, а не D::f.







Дата добавления: 2015-09-04; просмотров: 297. Нарушение авторских прав; Мы поможем в написании вашей работы!




Шрифт зодчего Шрифт зодчего состоит из прописных (заглавных), строчных букв и цифр...


Картограммы и картодиаграммы Картограммы и картодиаграммы применяются для изображения географической характеристики изучаемых явлений...


Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...


Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Влияние первой русской революции 1905-1907 гг. на Казахстан. Революция в России (1905-1907 гг.), дала первый толчок политическому пробуждению трудящихся Казахстана, развитию национально-освободительного рабочего движения против гнета. В Казахстане, находившемся далеко от политических центров Российской империи...

Виды сухожильных швов После выделения культи сухожилия и эвакуации гематомы приступают к восстановлению целостности сухожилия...

КОНСТРУКЦИЯ КОЛЕСНОЙ ПАРЫ ВАГОНА Тип колёсной пары определяется типом оси и диаметром колес. Согласно ГОСТ 4835-2006* устанавливаются типы колесных пар для грузовых вагонов с осями РУ1Ш и РВ2Ш и колесами диаметром по кругу катания 957 мм. Номинальный диаметр колеса – 950 мм...

Седалищно-прямокишечная ямка Седалищно-прямокишечная (анальная) ямка, fossa ischiorectalis (ischioanalis) – это парное углубление в области промежности, находящееся по бокам от конечного отдела прямой кишки и седалищных бугров, заполненное жировой клетчаткой, сосудами, нервами и...

Основные структурные физиотерапевтические подразделения Физиотерапевтическое подразделение является одним из структурных подразделений лечебно-профилактического учреждения, которое предназначено для оказания физиотерапевтической помощи...

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

Studopedia.info - Студопедия - 2014-2026 год . (0.016 сек.) русская версия | украинская версия