Объектно-ориентированное программирование на языке С++. Лясин Д.Н - 74 стр.

UptoLike

Составители: 

74
содержащего объявления этой функции. Такая дополнительная функциональность
конструктора обеспечивается транслятором.
Использование позднего связывания не отрицает возможности вызова из
производного класса экземпляра виртуальной функции базового. Просто для
подобного использования необходимо указывать при вызове полное
квалифицированное имя функции. Пример для программы из листинга 30:
main()
{
Base * ptb=new Child;
cout<<ptb->Base::func1(2); //на экран выводится 4
}
При определении виртуальных функций существует ряд синтак-
сических особенностей. Если какая-то функция определена в базовом
классе как виртуальная, а в производном классе переопределена с тем
же прототипом (то есть в производном классе в точности совпадают тип,
имя и список параметров компонентной функции), то в производном
классе ключевое слово virtual
можно опуститьфункция останется вир-
туальной по умолчанию. Если сигнатура (список формальных парамет-
ров) функции в производном классе изменится, то полиморфное поведе-
ние функций базового и производного классов станет невозможным. Ес-
ли же в производном классе будет определена компонентная функция с
тем же названием и сигнатурой, но с другим типом возвращаемого
зна-
чения, то транслятор выдаст сообщение об ошибке.
Виртуальной функцией может быть только нестатическая компо-
нентная функция класса, глобальная функция программы не может быть
виртуальной.
Рассмотрим пример программы, использующей виртуальные
функции для правильного отображения графических фигур, каждая из
которых описывается собственным классом.
//Листинг 31. Пример использования виртуальных функций
содержащего объявления этой функции. Такая дополнительная функциональность
конструктора обеспечивается транслятором.
       Использование позднего связывания не отрицает возможности вызова из
производного класса экземпляра виртуальной функции базового. Просто для
подобного     использования       необходимо     указывать       при   вызове   полное
квалифицированное имя функции. Пример для программы из листинга 30:
          main()
          {
          Base * ptb=new Child;
          cout<Base::func1(2);    //на экран выводится 4
   }
             При определении виртуальных функций существует ряд синтак-
       сических особенностей. Если какая-то функция определена в базовом
       классе как виртуальная, а в производном классе переопределена с тем
       же прототипом (то есть в производном классе в точности совпадают тип,
       имя и список параметров компонентной функции), то в производном
       классе ключевое слово virtual можно опустить – функция останется вир-
       туальной по умолчанию. Если сигнатура (список формальных парамет-
       ров) функции в производном классе изменится, то полиморфное поведе-
       ние функций базового и производного классов станет невозможным. Ес-
       ли же в производном классе будет определена компонентная функция с
       тем же названием и сигнатурой, но с другим типом возвращаемого зна-
       чения, то транслятор выдаст сообщение об ошибке.
             Виртуальной функцией может быть только нестатическая компо-
       нентная функция класса, глобальная функция программы не может быть
       виртуальной.
            Рассмотрим пример программы, использующей виртуальные
       функции для правильного отображения графических фигур, каждая из
       которых описывается собственным классом.
            //Листинг 31. Пример использования виртуальных функций

                                           74