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

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

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

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

empty-line
1
empty-line
4

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

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

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

Интервал:

Закладка:

Сделать

На самом деле всё довольно просто. Класс 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.

Из этого рисунка видно, что класс SleeperSofa включает Furniture , а также части классов Bed и Sofa , не содержащие Furniture . Далее находятся уникальные для класса SleeperSofa члены ( элементы в памяти не обязательно будут располагаться именно в таком порядке, но в данном обсуждении это несущественно ).

Теперь обращение к члену weight в функции fn( ) не многозначно, поскольку SleeperSofa содержит только одну копию Furniture . Наследуя этот класс виртуально, мы получили желаемую структуру наследования ( см. рис. 26.2 ).

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

Интервал:

Закладка:

Сделать

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

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


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

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

x