class x{ int a; public: int b; protected: int c; public: int d; .......... }; class y: public x{ ............. public: .............. void print(){ cout<<"\n a="<+-----------+ |вир. метод | |вир. метод | +-------------+ +-----------+ Если класс x содержит виртуальную функцию vf, а класс y, порождённый от класса x, также содержит функцию vf с той же сигнатурой, то обращение к vf для объекта класса x вызовет vf из y при доступе через указатель или ссылку на объект класса y. В этом случае говорят, что функция порождённого класса подменяет функцию родительского класса. Правила использования виртуальных методов: 1) если сигнатуры функций в родительском и порождённом классах различны, то механизм виртуальности не включается; 2) виртуальную функцию родительского класса нельзя переопределить функцией в порождённом классе, которая отличается от неё только типом возвращаемого значения; 3) eсли функция объявлена виртуальной, то все функции с такой же сигнатурой и возвращаемым значением в порождённых классах становятся виртуальными; 4) виртуальные функции не могут быть статическими или дружественными по отношению к другим классам; 5) виртуальные функции наследуются.