Для того, чтобы ваш объект-телефон мог эмулировать дисковый, кнопочный или платный телефон на выбор необходимо использовать полиморфный объект. Другими словами, для одного звонка объект-телефон мог бы представлять кнопочный аппарат, для другого выступал бы как платный телефон и т.д. Иначе говоря, от одного звонка к другому ваш объект-телефон должен изменять форму.
В этих разных классах телефона существует единственная отличающаяся функция — это метод dial. Для создания полиморфного объекта вы сначала определяете функции базового класса, которые отличаются от функций производных классов тем, что они виртуальные, предваряя их прототипы ключевым словом virtual, как показано ниже:
Далее в программе создается указатель на объект базового класса. Для вашей телефонной программы вы создадите указатель на базовый класс phone:
phone *poly_phone;
touch_tone telephone("555-1212");
Для изменения формы объекта вы просто присваиваете этому указателю адрес объекта производного класса, как показано ниже:
poly_phone = (phone *) &telephone;
Символы (phone *), которые следуют за оператором присваивания, являются оператором приведения типов, который сообщает компилятору C++, что все в порядке, необходимо присвоить адрес переменной одного типа (touch_tone) указателю на переменную другого типа (phone). Поскольку ваша программа может присваивать указателю объекта poly_phone адреса различных объектов, то этот объект может изменять форму, а следовательно, является полиморфным. Следующая программа использует этот метод для создания объекта-телефона. После запуска программы объект poly_phone меняет форму с дискового телефона на кнопочный, а затем на платный: