```cpp class stud { public: virtual void print() const; virtual ~stud; virtual float summa(); }; int main() { ps->print(); //stud::print() pa->print(); //asp::print() pd->print(); //doct::print() ps = pa = &a; //ps -> a ps->print(); //stud::print() замещается на asp::print ps = pd = &d; //ps -> d ps->print(); //stud::print() замещается на doct::print s.print(); a.print(); d.print(); s.summa(); a.summa(); d.summa(); stud* ps; ps = &s; ps->print(); //stud ps->summa(); //stud ps = &a; ps->print(); //asp ps->summa(); //asp ps = &d; ps->print(); //doct ps->summa(); //doct } ``` 1. Виртуальные функции могут быть с кодом или без него 2. Механизм замещения позволяет динамически (во время выполнения программы) выбирать соответствующую компонентную функцию 3. Механизм сочетания открытого наследования и виртуальных функций является наиболее обобщенным и гибким способом программирования - чистый полиморфизм 4. Виртуальными могут быть только нестатические компонентные функции 5. Виртуальность наследуется 6. В производных классах использовать слово **virtual** необязательно 7. Конструкторы не могут быть виртуальными и не наследуются 8. Деструкторы могут быть виртуальными. Каждый класс, который имеет виртуальные функции, должен иметь виртуальный деструктор Виртуальные функции позволяют делать выбор компонентных функций на этапе выполнения программы. Виртуальные функции могут быть **обычными** и **необычными**. Обычная виртуальная функция - это функция с кодом. Необычные виртуальные функции своего кода не имеют. Их еще называют **отложенные методы**. За них работу будут выполнять функции с такими же именами и такими же типами в производных классах (т. е. замещать их).