8.5.4 Виртуальные Функции

8.5.4 Виртуальные Функции

Если базовый класс base содержит virtual (виртуальную) (#8.1) функцию vf, а производный класс derived также содержит функцию vf, то обе функции должны иметь один и тот же тип, и вызов vf для объекта класса derived вызывает derived::vf. Например:

struct base (* virtual void vf (); void f (); *);

class derived : public base (* void vf (); void f (); *);

derived d; base* bp = amp;d; bp-»vf(); bp-»f();

Вызовы вызывают, соответственно, derived::vf и base::f для объекта класса derived, именованного d. Так что интерпртация вызова виртуальной функции зависит от типа объекта, для которого она вызвана, в то время как интерпретация вызова нвиртуальной функции зависит только от типа указателя, обознчающего объект.

Виртуальная функция не может быть другом (friend) (#8.5. 10). Функция f в классе, выведенном из класса, который имеет виртуальную функцию f, сама считается виртуальной. Виртуалная функция в базовом классе должна быть определена. Виртальная функция, которая была определена в базовом классе, не обязательно должна определяться в производном классе. В этом случае во всех вызовах используется функция, определенная для базового класса.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Виртуальные покупки

Из книги автора

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


10.2. Виртуальные библиотеки

Из книги автора

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


39. Виртуальные функции стоит делать неоткрытыми, а открытые — невиртуальными

Из книги автора

39. Виртуальные функции стоит делать неоткрытыми, а открытые — невиртуальными РезюмеВ базовых классах с высокой стоимостью изменений (в частности, в библиотеках) лучше делать открытые функции невиртуальными. Виртуальные функции лучше делать закрытыми, или защищенными —


Правило 9: Никогда не вызывайте виртуальные функции в конструкторе или деструкторе

Из книги автора

Правило 9: Никогда не вызывайте виртуальные функции в конструкторе или деструкторе Начну с повторения: вы не должны вызывать виртуальные функции во время работы конструкторов или деструкторов, потому что эти вызовы будут делать не то, что вы думаете, и результатами их


IV. Виртуальные клавиатуры

Из книги автора

IV. Виртуальные клавиатуры IV.1. Виды виртуальных клавиатурИногда требуется в текст документа (корректура, правка после OCR) ввести Unicode символы. Удобнее для этого использовать соответствующие виртуальные клавиатуры:1. Различные символы (стрелки, ноты…): 2. Математическая: 3.


17.5. Виртуальные функции в базовом и производном классах

Из книги автора

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


17.5.4. Виртуальные функции и аргументы по умолчанию

Из книги автора

17.5.4. Виртуальные функции и аргументы по умолчанию Рассмотрим следующую простую иерархию классов:#include iostreamclass base {public:virtual int foo( int ival = 1024 ) {cout " base::foo() -- ival: " ival endl;return ival;}// ...};class derived : public base {public:virtual int foo( int ival = 2048 ) {cout " derived::foo() -- ival: " ival endl;return ival;}// ...};Проектировщик


17.5.5. Виртуальные деструкторы

Из книги автора

17.5.5. Виртуальные деструкторы В данной функции мы применяем оператор delete:void doit_and_bedone( vector Query* *pvec ){// ...for ( ; it != end_it; ++it ){Query *pq = *it;// ...delete pq;}}Чтобы функция выполнялась правильно, применение delete должно вызывать деструктор того класса, на который указывает pq. Следовательно,


17.5.8. Виртуальные функции, конструкторы и деструкторы

Из книги автора

17.5.8. Виртуальные функции, конструкторы и деструкторы Как мы видели в разделе 17.4, для объекта производного класса сначала вызывается конструктор базового, а затем производного класса. Например, при таком определении объекта NameQueryNameQuery poet( "Orlen" );сначала будет вызван


19.2.4. Объекты-исключения и виртуальные функции

Из книги автора

19.2.4. Объекты-исключения и виртуальные функции Если сгенерированный объект-исключение имеет тип производного класса, а обрабатывается catch-обработчиком для базового, то этот обработчик не может использовать особенности производного класса. Например, к функции-члену value(),


1.18 Виртуальные Функции

Из книги автора

1.18 Виртуальные Функции Предположим, что мы пишем программу для изображения фигур на экране. Общие атрибуты фигуры представлены классом shape, а специальные атрибуты – специальными классами:class shape (* point center; color col; //... public: void move(point to) (* center=to; draw(); *) point where() (* return center; *) virtual void


7.2.8 Виртуальные Функции

Из книги автора

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


8.5.4 Виртуальные Функции

Из книги автора

8.5.4 Виртуальные Функции Если базовый класс base содержит virtual (виртуальную) (#8.1) функцию vf, а производный класс derived также содержит функцию vf, то обе функции должны иметь один и тот же тип, и вызов vf для объекта класса derived вызывает derived::vf. Например:struct base (* virtual void vf (); void f (); *);class


Виртуальные открытки

Из книги автора

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