Д. Стефенс - C++. Сборник рецептов

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

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

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

Данная книга написана экспертами по C++ и содержит готовые рецепты решения каждодневных задач для программистов на С++. Один из авторов является создателем библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом. В книге затрагивается множество тем, вот лишь некоторые из них: работа с датой и временем; потоковый ввод/вывод; обработка исключений; работа с классами и объектами; сборка приложений; синтаксический анализ XML-документов; программирование математических задач. Читатель сможет использовать готовые решения, а сэкономленное время и усилия направить на решение конкретных задач.

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

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

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

Интервал:

Закладка:

Сделать

Пример 8.11. Использование чистого интерфейса

class Person {

public:

virtual void eat() = 0;

virtual void sleep() = 0;

virtual void walk() = 0;

virtual void jump() = 0;

};

class IAirborne {

public:

virtual void fly() = 0;

virtual void up() = 0;

virtual void down() = 0;

};

class Superhero : public Person, // Супергерой «является» человеком

public IAirborne { // и летает

public:

virtual void eat();

virtual void sleep();

virtual void walk();

virtual void jump();

virtual void fly();

virtual void up();

virtual void down();

virtual ~Superhero();

};

void Superhero::fly() {

// ...

}

// Все виртуальные методы реализуем в родительских классах супергероя...

int main() {

Superhero superman;

superman.walk(); // Супермен может ходить как человек

superman.fly(); // или летать как птица

}

Однако летать может огромное количество объектов, так что не стоит называть этот интерфейс, например, IBird. IAirborneуказывает, что всё, что поддерживает этот интерфейс, может летать. Все, что он делает, — это позволяет клиентскому коду быть уверенным, что если он работает с объектом, наследуемым от IAirborne, клиентский код может вызвать методы fly, upи down.

Второе различие состоит в том, что ABC может определить абстрактную сущность, которая не имеет смысла как объект, так как она, по сути, является обобщением. В этом случае проверка на принадлежность при наследовании выполняется, но ABC — это абстракция, так как сам по себе он не содержит реализаций, которые могут наследоваться объектами. Рассмотрим класс AbstractConfigFileиз примера 8.10. Имеет ли смысл создавать объект типа AbstractConfigFile? Нет, имеет смысл только создавать различные виды настроечных файлов, которые имеют конкретное представление.

Вот краткий перечень правил, касающихся абстрактных классов и чисто виртуальных функций. Класс является абстрактным, если:

• он объявляет, по крайней мере, одну чисто виртуальную функцию;

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

Создавать объекты абстрактного класса нельзя. Однако абстрактный класс может:

• содержать данные-члены;

• содержать не-виртуальные методы;

• предоставлять реализации для чисто виртуальных функций;

• делать большую часть из того, что может делать обычный класс.

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

Когда дело доходит до реализации, использование ABC в C++ требует осторожности. Используется ли ABC как чистый интерфейс или нет, зависит от вас. Например, предположим на мгновение, что в примере с супергероем я решил, что класс Personдолжен быть абстрактным, но так как все виды людей имеют имя и фамилию, я добавил в класс эти два члена и связал с ними методы их задания и получения, так что авторам подклассов этого делать уже не требуется.

class Person {

public:

virtual void eat() = 0;

virtual void sleep() = 0;

virtual void walk() = 0;

virtual void jump() = 0;

virtual void setFirstName(const string& s) {firstName_ = s;}

virtual void setLastName(const string& s) {lastName_ = s;}

virtual string getFirstName() {return(firstName_);}

virtual string getLastName() {return(lastName_);}

protected:

string firstName_;

string lastName_;

};

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

string Superhero::getLastName() {

return( Person::getLastName()+ " (Superhero)");

}

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

class Person {

// ...

virtual void setFirstName(const string& s) = 0;

// ...

Person::setFirstName(const string& s) {

firstName_ = s;

}

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

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

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

Интервал:

Закладка:

Сделать

Похожие книги на «C++. Сборник рецептов»

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


Отзывы о книге «C++. Сборник рецептов»

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