Стефан Дэвис - С++ для чайников .

Тут можно читать онлайн Стефан Дэвис - С++ для чайников . - бесплатно полную версию книги (целиком) без сокращений. Жанр: sci_tech, издательство Издательский дом Вильямс. Компьютерное издательство Диалектика, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    С++ для чайников .
  • Автор:
  • Жанр:
  • Издательство:
    Издательский дом Вильямс. Компьютерное издательство Диалектика
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    0-7645-6852-3, 978-5-8459-0723-3
  • Рейтинг:
    4/5. Голосов: 11
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Стефан Дэвис - С++ для чайников . краткое содержание

С++ для чайников . - описание и краткое содержание, автор Стефан Дэвис, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru
empty-line
1
empty-line
4

С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)

С++ для чайников . - читать книгу онлайн бесплатно, автор Стефан Дэвис
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

[ Технические подробности ]

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

void fn( )

{

Account acnt( 1234, 100.00 ) ; /* Это некорректно */

acnt.withdrawal( 50 ) ; /* Куда, по-вашему, должен обращаться этот вызов? */

}

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

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

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

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

_________________

255 стр. Глава 22. Разложение классов

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

class Display

{

public :

virtual void initialize( ) = 0 ;

virtual void write( char *pString ) = 0 ;

} ;

class SVGA : public Display

{

/* Сделаем обе функции-члена "реальными" */

virtual void initialize( ) ;

virtual void write( char *pString ) ;

} ;

class HWVGA : public Display

{

/* Переопределим только одну функцию */

virtual void write( char *pString ) ;

} ;

class ThreedVGA : public HWVGA

{

virtual void initialize( ) ;

} ;

void fn( )

{

SVGA mc ;

VGA vga ;

/* Всё остальное */

}

Класс Display , описывающий дисплеи персонального компьютера, содержит две чисто виртуальные функции: initialize( ) и write( ) . Вы не можете ввести эти функции в общем виде. Разные типы видеоадаптеров инициализируются и осуществляют вывод по-разному.

Один из подклассов — SVGA — не абстрактный. Это отдельный тип видеоадаптера, и программист точно знает, как его реализовать. Таким образом, класс SVGA переопределяет обе функции — initialize( ) и write( ) — именно так, как необходимо для данного адаптера.

Ещё один подкласс — HWVGA . Программисту известно, как программировать ускоренный VGA-адаптер. Поэтому между общим классом Display и его частным случаем, ThreedVGA , который представляет собой специальный тип карт 3-D, находится ещё один уровень абстракции.

В нашем обсуждении предположим, что запись во все аппаратно ускоренные карты VGA происходит одинаково ( это не соответствует истине, но представим себе, что это так ). Чтобы правильно выразить общее свойство записи, вводится класс HWVGA , реализующий функцию write( ) ( и другие общие для HWVGA свойства ).

_________________

256 стр. Часть 4. Наследование

При этом функция initialize( ) не переопределяется, поскольку для разных типов карт HWVGA она реализуется по-разному.

Несмотря на то что функция write( ) переопределена в классе HWVGA , он всё равно остаётся абстрактным, так как функция initialize( ) всё ещё не переопределена.

Поскольку ThreedVGA наследуется от HWVGA , он должен переопределить только одну функцию, initialize( ) , для того чтобы окончательно определить адаптер дисплея. Таким образом, функция fn( ) может свободно реализовать и использовать объект класса ThreedVGA .

Замещение нормальной функцией последней чисто виртуальной функции делает класс - фото 279

«Замещение нормальной функцией последней чисто виртуальной функции делает класс завершённым ( т.е. неабстрактным ). Только неабстрактные классы могут быть реализованы в виде объектов.»

[ Помни! ]

Передача абстрактных классов...257

Поскольку вы не можете реализовать абстрактный класс, упоминание о возможности создавать указатели на абстрактные классы звучит несколько странно. Однако если вспомнить о полиморфизме, то станет ясно, что это не так уж глупо, как кажется поначалу. Рассмотрим следующий фрагмент кода:

void fn( Account *pAccount ) ; /* Это допустимо */

void otherFn( )

{

Savings s ;

Checking c ;

/* Savings ЯВЛЯЕТСЯ Account */

fn( & s ) ;

/* Checking — тоже */

fn( & c ) ;

}

В этом примере pAccount объявлен как указатель на Account . Разумеется, при вызове функции ей будет передаваться адрес какого-то объекта неабстрактного класса, например Checking или Savings .

Все объекты, полученные функцией fn( ) , будут объектами либо класса Checking , либо Savings ( или другого неабстрактного подкласса Account ). Можно с уверенностью заявить, что вы никогда не передадите этой функции объект класса Account , поскольку никогда не сможете создать объект этого класса.

Нужны ли чисто виртуальные функции...257

Если нельзя определить функцию withdrawal( ) , почему бы просто не опустить её? Почему бы не объявить её в классах Savings и Checking , где она может быть определена, оставив в покое класс Account ? Во многих объектно-ориентированных языках вы могли бы именно так и сделать. Но С++ предпочитает иметь возможность убедиться в вашем понимании того, что вы делаете.

Не забывайте что объявление функции это указание полного имени функции - фото 280

«Не забывайте, что объявление функции — это указание полного имени функции, включающего её аргументы. Определение же функции включает в себя и код, который будет выполняться в результате вызова этой функции.»

[ Помни! ]

_________________

257 стр. Глава 22. Разложение классов

Чтобы продемонстрировать суть сказанного, можно внести следующие незначительные изменения в класс Account :

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стефан Дэвис читать все книги автора по порядку

Стефан Дэвис - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




С++ для чайников . отзывы


Отзывы читателей о книге С++ для чайников ., автор: Стефан Дэвис. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x