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

Тут можно читать онлайн Стефан Дэвис - С++ для чайников . - бесплатно полную версию книги (целиком) без сокращений. Жанр: 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

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

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

Интервал:

Закладка:

Сделать

Рис 262 Выделение общих свойств кровати и дивана Если отделить - фото 319

Рис. 26.2. Выделение общих свойств кровати и дивана

Если отделить классFurniture мебель конфликт имён будет устранен Итак с - фото 320

«Если отделить классFurniture ( мебель ), конфликт имён будет устранен. Итак, с чувством глубокого удовлетворения и облегчения, в предвкушении успеха реализуем новую иерархию классов в программеMultipleInheritanceFactoring , которую вы можете найти на прилагаемом компакт-диске:»

[ Диск ]

//

/* MultipleInheritanceFactoring — класс, являющийся */

/* наследником нескольких */

/* базовых классов */

//

#include

#include

#include

using namespace std ;

/* Furniture — фундаментальная концепция, обладающая весом */

class Furniture

{

_________________

301 стр. Глава 26. Множественное наследование

public :

Furniture( int w ) : weight( w ) { }

int weight ;

} ;

class Bed : public Furniture

{

public :

Bed( int weight ) : Furniture( weight ) { }

void sleep( ) { cout << "Спим" << endl ; }

} ;

class Sofa : public Furniture

{

public :

Sofa( int weight ) : Furniture( weight ) { }

void watchTV( ) { cout << "Смотрим телевизор" << endl ; }

} ;

/* SleeperSofa — диван-кровать */

class SleeperSofa : public Bed , public Sofa

{

public :

SleeperSofa( int weight ) : Sofa( weight ) , Bed( weight ) { }

void foldOut( ) { cout << "Раскладываем диван-кровать"

<< endl ; }

} ;

int main( int nNumberofArgs , char* pszArgs[ ] )

{

/* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */

setlocale ( LC_ALL , ".1251" ) ;

SleeperSofa ss( 10 ) ;

/* Section 1 — неоднозначность: Furniture::Sofa или Furniture::Bed? */

/*

cout << "Beс = "

<< ss.weight

<< endl ;

*/

/* Section 2 — Один из способов устранения неоднозначности */

SleeperSofa* pSS = & ss ;

Sofa* pSofa = ( Sofa* )pSS ;

Furniture* pFurniture = ( Furniture* )pSofa ;

cout << "Beс = "

<< pFurniture -> weight

<< endl ;

/* Пауза для того, чтобы посмотреть на результат работы программы */

system( "PAUSE" ) ; return 0 ;

}

302 стр Часть 5 Полезные особенности Мда Не говори - фото 321

_________________

302 стр. Часть 5. Полезные особенности

М-да... "Не говори "гоп", пока не переехал Чоп" — новая иерархия классов совершенно нас не спасает, weight остаётся неоднозначным. Попробуем привести ss к классу Furniture .

#include

void fn( )

{

SleeperSofa ss ;

Furniture* pF ;

pF = ( Furniture* ) & ss ;

cout << "Beс = "

<< pF -> weight

<< "\n" ;

} ;

Приведение ss к классу Furniture тоже ничего не даёт. Более того, я получил какое-то подозрительное сообщение о том, что приведение SleeperSofa* к классу Furniture* неоднозначно. Да что, в конце концов, творится?

На самом деле всё довольно просто. Класс SleeperSofa не наследуется напрямую от класса Furniture . Сначала Furniture наследуют классы Bed и Sofa , а уж потом SleeperSofa наследуется от этих классов. Класс SleeperSofa выглядит в памяти так, как показано на рис. 26.3.

Рис 263 Расположение класса SleeperSofa в памяти Как видите SleeperSofa - фото 322

Рис. 26.3. Расположение класса SleeperSofa в памяти

Как видите, SleeperSofa состоит из класса Bed , за которым в полном составе следует класс Sofa , а после него — уникальные члены класса SleeperSofa . Каждый из подобъектов класса SleeperSofa имеет свою собственную часть Furniture , поскольку они оба наследуются от этого класса. В результате объекты класса SleeperSofa содержат два объекта класса Furniture .

Таким образом, становится ясно, что я не сумел создать иерархию, показанную на рис. 26.2. Иерархия наследования, которая была создана в результате выполнения предыдущей программы, показана на рис. 26.4.

SleeperSofa содержит два объекта класса Furniture — явная бессмыслица! Необходимо, чтобы SleeperSofa наследовал только одну копию Furniture и чтобы Bed и Sofa имели к ней доступ. В С++ это достигается виртуальным наследованием, поскольку в этом случае используется ключевое слово virtual .

_________________

303 стр. Глава 26. Множественное наследование

Рис 264 Результат попытки создания иерархии классов В данном случае - фото 323

Рис. 26.4. Результат попытки создания иерархии классов

В данном случае произошло смешение терминов однако необходимо принять к - фото 324

«В данном случае произошло смешение терминов, однако необходимо принять к сведению, что виртуальное наследование не имеет ничего общего с виртуальными функциями!»

[ Советы ]

Вооружённый новыми знаниями, я возвращаюсь к классу SleeperSofa и реализую его так, как показано ниже.

//

/* VirtualInheritance — виртуальное */

/* наследование позволяет */

/* классам Bed и Sofa использовать */

/* общий базовый класс */

//

#include

#include

#include

using namespace std ;

/* Furniture — фундаментальная концепция, обладающая весом */

class Furniture

{

public :

Furniture( int w = 0 ) : weight( w ) { }

int weight ;

} ;

class Bed : virtual public Furniture

{

public :

Bed( ) { }

void sleep( ) { cout << "Спим" << endl ; }

} ;

class Sofa : virtual public Furniture

_________________

304 стр. Часть 5. Полезные особенности

{

public :

Sofa( ) { }

void watchTV( ) { cout << "Смотрим телевизор" << endl ; }

} ;

/* SleeperSofa — диван-кровать */

class SleeperSofa : public Bed , public Sofa

{

public :

SleeperSofa( int weight ) : Furniture( weight ) { }

void foldOut( ) { cout << "Раскладываем диван-кровать"

<< endl ; }

} ;

int main( int nNumberofArgs , char* pszArgs[ ] )

{

/* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */

setlocale ( LC_ALL , ".1251" ) ;

SleeperSofa ss( 10 ) ;

/* Section 1 — неоднозначности больше нет, есть только один вес */

cout << "Вес = "

<< ss.weight

<< endl ;

/* Section 2 — Один из способов устранения неоднозначности */

SleeperSofa* pSS = & ss ;

Sofa* pSofa = ( Sofa* )pSS ;

Furniture* pFurniture = ( Furniture* )pSofa ;

cout << "Bec = "

<< pFurniture -> weight

<< endl ;

/* Пауза для того, чтобы посмотреть на результат работы программы */

system( "PAUSE" ) ; return 0 ;

}

Обратите внимание на ключевое слово virtual используемое при наследовании - фото 325

Обратите внимание на ключевое слово virtual , используемое при наследовании классов Bed и Sofa от класса Furniture . Оно означает примерно следующее: "Дайте-ка мне копию Furniture , но если она уже существует, то я использую именно её". В итоге класс SleeperSofa будет выглядеть, как показано на рис. 26.5.

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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