![]() |
|
Программирование >> Расширенная версия языка c++
class area { double dlml, dim2; размеры фигуры public: voi double dl, double d2) diml = dl; ditti2 = d2; voi uble Sdl, double &d2) { dl d2 diml; dir[i2; virtual double getareaO , - - cou Вам необходо поженить эту функцию\п ; return class public area { publc: .- double getareaO i double dl, d2; - d2); return dl * d2; class triangle: public area { public: double double dl, d2; getdiin(dl, d2) ; return . 0.5 * dl,. int mainO area *p; rectangle r; triangle t; r.setarea(3.3, 4.5); t.setarea(4.0, 5.0); return О; ![]() Обратите внимание, что определение getarea() внутри класса area является только заглушкой и, в действительности, не выполняет никаких действий. Поскольку класс area не связан с фигурой конкретного типа, то нет значимого определения, которое можно дать функции jetarcaO внутри класса area. При этом, для того чтобы нести полезную нагрузку, функция getarea() должна быть переопределена в производном классе. В следующем разделе вы узнаете об этом подробнее. Напишите программу создания базового класса num. В этом классе должно храниться целое и определяться виртуальная функция shownum(). Создайте два производных класса thex и outoct, которые наследуют класс num. Функция shownumO должна быть переопределена в производных классах так, чтобы осуществлять вывод на экран значений, в шестнадцатеричной и восьмеричной системах счисления соответственно. 2. Напишите программу, в которой базовый класс dist используется для хранения в переменной тип шЫе расстояния между двумя точками. В классе dist создайте виртуальную функцию которая выводит на экран время, необходимое для прохождения этого расстояния с учетом того, что расстояние задано в милях, а скорость равна 60 миль в час. В производном классе metric переопределите функцию trav time() так, чтобы она выводила на экран время, необходимое для прохождения этого расстояния, считая теперь, что расстояние задано в километрах, а скорость равна 100 километров в час. 10.3. Дополнительные сведения о виртуальных функциях 1 .ж Как показано в примере 4 предыдущего раздела, иногда, когда виртуальная функция объявляется в базовом классе, она не выполняет никаких значимых действий. Это вполне обычная ситуация, поскольку часто в базовом классе законченный тип данных не определяется. Вместо этого в нем просто содержится базовый набор функций-членов и переменных, для которых в производном классе определяется все недостающее. Когда в Р - &Г; rf ... cout Площадь прямоугольника: p->getarea () \п; , - р=fit; cout Площадь треугольника: p->getarea () \п; функции базового класса отсутствует значимое действие, в любом классе, производном от этого базового, такая функция ельнодолжна быть переопределена. Для реализации этого положения в С++ поддерживаются так называемые чистые виртуальные функции (pure virtualfunction). Чистехе виртуальные функции не определяются в базовом классе. Туда включаются только прототипы этих функций. Для чистой виртуальной функции используется такая основная форма: virtual ти хсок парамвтров)= 0; Ключевой частью этого объявления является приравнивание функции нулю. Это сообщает компилятору, что в базовом классе не существует тела функции. Если функция задается как чистая виртуальная, это предполагает, что она обязательно должна подменяться в каждом производном классе. Если этого нет, то при компиляции возникнет ошибка. Таким образом, создание чистых виртуальных функций - это путь, гарантирующий, что производные классы обеспечат их переопределение. Если класс содержит хотя бы одну чистую виртуальную функцию, то о нем говорят как об абстрактном классе (abstract class). Поскольку в абстрактном классе содержится, по крайней мере, одна функция, у которой отсутствует тело функции, технически такой класс неполон, и ни одного объекта этого класса создать нельзя. Таким образом, абстрактные классы могут быть только наследуемыми. Они никогда не бывают изолированными. Важно понимать, однако, что по-прежнему можно создавать указатели абстрактного класса, благодаря которым достигается динамический полиморфизм. (Также допускаются и ссылки на абстрактный класс.) Если виртуальная функция наследуется, то это соответствует ее виртуальной природе. Это означает, что если производный класс используется в качестве базового для другого производного класса, то виртуальная функция может подменяться в последнем производном классе (так же, как и в первом производном классе). Например, если базовый класс В содержит виртуальную функции Д), и класс D1 наследует клас1, а класс D2 наследует класс D1, тогда функция f() может подменяться как в классе D1, так и в классе D2. Примеры! 1. Здесь представлена несколько усовершенствованная версии аммы, показанной в примере 4 предыдущего раздела. В этой версии программы в базовом классе area функция getarea() объявляется как чистая виртуальная функция. . . Создание абстрактного класса #include <iostream> . using namespace std;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |