Теория и реализация языков программирования

         

Единичное наследование и виртуальные функции


Если класс base содержит виртуальную функцию vf, а класс derived, порожденный по классу base, также содержит функцию vf того же типа, то обращение к vf для объекта класса derived вызывает derived :: vf даже при доступе через указатель или ссылку на base. В таком случае говорят, что функция производного класса подменяет (override) функцию базового класса. Если, однако, типы этих функций различны, то функции считаются различными и механизм виртуальности не включается.

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

class A { public: int a; virtual void f(int); virtual void g(int); virtual void h(int); }; class B : public A { public: int b; void g(int); }; class C : public B { public: int c; void h(int); };

Объект класса C будет выглядеть примерно так:


Рис. 9.20. 



Содержание раздела