Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Глава23.Разложениеклассов 247




Концепция абстрактных классов

Абстрактный класс— это класс с одной или                   чисто виртуальной Прекрасно, это все разъясняет...

Ну хорошо, чисто виртуальная функция — это функция-член без тела функции (которого нет. например, потому, что никто не знает, как реализовать это самое тело). Бессмысленно спрашивать о том, каким должно быть тело функции with - drawal () в классе Account. Хотя, конечно, сама концепция снятия денег со сче- та имеет смысл. Программист на C++ может написать функцию withdrawa l () , которая будет отражать концепцию снятия денег со счета, но при этом  данная функция не будет иметь тела, поскольку мы не знаем, как ее реализовать. Такая функция называется  чисто  виртуальной18                спрашивайте меня, откуда взялось

это название).

Синтаксис объявления чисто виртуальной функции показан в приведенном ниже классе Account.

//Account — это

 

clas s Account

{

protected:

с) ;

 

accNo, float initialBalance =

unsigned int

 

Account

Account

static int

 

//функции транзакций void

 

//приведенная ниже функция является чисто

virtual void              amount) =

 

protected:

//если хранить счета в связанном      не

//будет ограничения их количество Account

Account

int count; //количество

 

float balance;

 

Наличие после объявления функции                             (} символов 0 показывает, что программист не намеревается в данный момент определять эту функцию. Такое объ- явление просто занимает место для тела функции, которое позже будет реализовано в подклассах. От подклассов класса Account ожидается, что они переопределят эту функцию более конкретно.

 

 

Вообще говоря, чисто виртуальная функция может иметь тело, но обсуждение этого вопроса выходит за рамки данной книги. — Прим. ред.


Часть  Наследование


Я считаю это объяснение глупым, и мне оно нравится не более чем вам, так что просто выучите и живите с ним. Для этого объяснения есть причина, если не оправдание. Каждая виртуальная функция должна иметь свою ячейку в специальной таблице, в которой содер- жится адрес функции. Так вот: ячейка для чисто виртуальной функции содержит ноль.

Абстрактный класс не может быть реализован; другими                               вы не можете создать объект абстрактного класса. Например, приведенное ниже объявление не- корректно.

void

f

Account                 //это некорректно

//куда, по-вашему, должен

вызов?

}

Если бы такое объявление было разрешено, конечный объект оказался бы

незавершенным, поскольку был бы лишен некоторых возможностей. Например, что бы выполнял приведенный в этом же объявлении вызов? Помните, функции Account: () не существует.

Абстрактные классы служат базой для других классов. Account содержит уни- версальные свойства для всех банковских счетов. Вы можете создать другие типы банковских счетов, наследуя класс Account, но сам этот класс не может быть реализован.

Создание полноценного класса из абстрактного

Подкласс абстрактного класса остается абстрактным, пока в нем не переопределе- ны все чисто виртуальные функции. Класс Savings не является абстрактным, скольку переопределяет чисто виртуальную функцию withdrawal () совершенно ре- альной.  Объект класса  Savings отлично  знает,  как реализовать  функцию

() и куда обращаться при ее вызове. То же касается и класса

он не  виртуальный,  поскольку                              () переопределяет чисто виртуальную функцию, определенную ранее в базовом классе.

Подкласс абстрактного класса, конечно, может оставаться абстрактным. Разберем- ся с приведенными ниже классами.

class Display

{

 

virtual void initialize () =

virtual void            *pString) = 0;

 

 

classSVGA:publicDisplay

{

обе функции-члена "реальными virtual void initialize!);

virtual void

class  : public Display

{

одну функцию


Поделиться:



Последнее изменение этой страницы: 2019-04-19; Просмотров: 174; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.011 с.)
Главная | Случайная страница | Обратная связь