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

Здесь есть возможность читать онлайн «Стефан Дэвис - С++ для чайников .» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2007, ISBN: 2007, Издательство: Издательский дом Вильямс. Компьютерное издательство Диалектика, Жанр: Технические науки, Программирование, Программы, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

С++ для чайников .: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «С++ для чайников .»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

empty-line
1
empty-line
4

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

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «С++ для чайников .», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

<< "\n" ;

}

Теперь в программе нужно явно указывать, какая именно переменная weight нужна, используя для этого имя базового класса. Приведённый ниже пример вполне корректен.

#include

void fn( )

{

SleeperSofa ss ;

cout << "Вес дивана = "

<< ss.Sofa::weight /*укажем, какой именно вес */

<< "\n" ;

}

Хотя такое решение и устраняет ошибку, указание имени базового класса во внешнем приложении нежелательно: ведь при этом информация о внутреннем устройстве класса должна присутствовать за его пределами. В нашем примере функция fn( ) должна располагать сведениями о том, что класс SleeperSofa наследуется от класса Sofa . Такие конфликты имён невозможны при одиночном наследовании, но служат постоянным источником неприятностей при наследовании множественном.

_________________

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

►Виртуальное наследование...301

В случае класса SleeperSofa конфликт имён weight является, по сути, небольшим недоразумением. Ведь на самом деле диван-кровать не имеет отдельного веса как кровать, и отдельного веса как диван. Конфликт возник потому, что такая иерархия классов не вполне адекватно описывает реальный мир. Дело в том, что разложение на классы оказалось неполным.

Если немного подумать над этой проблемой, становится ясно, что и кровать и диван являются частными случаями некоторой более фундаментальной концепции мебели ( думаю, можно было предложить нечто ещё более фундаментальное, но для нас достаточно ограничиться мебелью ). Вес является свойством любой мебели, что показано на рис. 26.2.

Рис 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* неоднозначно. Да что, в конце концов, творится?

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

Интервал:

Закладка:

Сделать

Похожие книги на «С++ для чайников .»

Представляем Вашему вниманию похожие книги на «С++ для чайников .» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «С++ для чайников .»

Обсуждение, отзывы о книге «С++ для чайников .» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x