Программирование >>  Расширенная версия языка c++ 

1 ... 99 100 101 [ 102 ] 103 104 105 ... 227


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;



1 ... 99 100 101 [ 102 ] 103 104 105 ... 227

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика