Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

struct Circle:Shape {

void draw_lines(int) const; // возможно, ошибка (аргумент int?)

void drawlines const; // возможно, ошибка (опечатка
в имени?)

void draw_lines; // возможно, ошибка (нет const?)

// ...

};

В данном случае компилятор увидит три функции, независимые от функции

Shape::draw_lines
(поскольку они имеют другие имена или другие типы аргументов), и не будет их замещать. Хороший компилятор
предупредит программиста о возможных ошибках. В данном случае нет никаких признаков того, что вы действительно собирались замещать виртуальную функцию.

Пример функции

draw_lines
реален, и, следовательно, его трудно описать очень подробно, поэтому ограничимся чисто технической иллюстрацией замещения.

struct B {

virtual void f const { cout << "B::f "; }

void g const { cout << "B::g "; } // невиртуальная

};

struct D : B {

void f const { cout << "D::f "; } // замещает функцию B::f

void g { cout << "D::g "; }

};

struct DD : D {

void f { cout << "DD::f "; } // не замещает функцию D::f
(нет const)

void g const { cout << "DD::g "; }

};

Здесь мы описали небольшую иерархию классов с одной виртуальной функцией

f
. Мы можем попробовать использовать ее. В частности, можем попробовать вызвать функцию
f
и невиртуальную функцию
g
, не знающую конкретного типа объекта, который она должна вывести на печать, за исключением того, что он относится либо к классу
B
, либо к классу, производному от класса
B
.

void call(const B& b)

// класс D — разновидность класса B,

// поэтому функция call может

// получить объект класса D

// класс DD — разновидность класса D,

// а класс D — разновидность класса B,

// поэтому функция call может получать объект класса DD

{

b.f;

b.g;

}

int main

{

B b;

D d;

DD dd;

call(b);

call(d);

call(dd);

b.f;

b.g;

d.f;

d.g;

dd.f;

dd.g;

}

В результате выполнения этой программы получим следующее:

B::f B::g D::f B::g D::f B::g B::f B::g D::f D::g DD::f DD::g

Если вы понимаете, почему, то знаете механизмы наследования и виртуальных

функций.

14.3.4. Доступ

Язык С++ реализует простую модель доступа к членам класса. Члены класса могут относиться к следующим категориям.

• Закрытые (private). Если член класса объявлен с помощью ключевого слова

private
, то его имя могут использовать только члены данного класса.

• Защищенные (protected). Если член класса объявлен с помощью ключевого слова

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

• Открытые (public). Если член класса объявлен с помощью ключевого слова

public
, то его имя могут использовать все функции.

Изобразим это на рисунке.

Базовый класс также может иметь атрибут

private
,
protected
или
public
.

• Если базовый класс для класса

D
является закрытым, то имена его открытых и защищенных членов могут использоваться только членами класса
D
.

• Если базовый класс для класса

D
является защищенным, то имена его открытых и защищенных членов могут использоваться только членами класса
D
и членами классов, производных от класса
D
.

• Если базовый класс для класса

D
является открытым, то имена его открытых членов могут использоваться любыми функциями.

Эти определения игнорируют понятие дружественной функции или класса и другие детали, которые выходят за рамки рассмотрения нашей книги. Если хотите стать крючкотвором, читайте книги Stroustrup, The Design and Evolution of C++ (Страуструп, “Дизайн и эволюция языка С++”), The C++ Programming Language (Страуструп, “Язык программирования С++”) и стандарт 2003 ISO C++. Мы не рекомендуем вам становиться крючкотвором (т.е. вникать в мельчайшие детали языковых определений) — быть программистом (разработчиком программного обеспечения, инженером, пользователем, назовите как хотите) намного увлекательнее и полезнее для общества.

14.3.5. Чисто виртуальные функции

Абстрактный класс — это класс, который можно использовать только в качестве базового. Абстрактные классы используются для представления абстрактных понятий; иначе говоря, мы используем абстрактные классы для описания понятий, которые являются обобщением общих характеристик связанных между собой сущностей. Описанию абстрактного понятия (abstract concept), абстракции (abstraction) и обобщению (generalization) посвящены толстенные книги по философии. Однако философское определение абстрактного понятия мало полезно. Примерами являются понятие “животное” (в противоположность конкретному виду животного), “драйвер устройства” (в противоположность драйверу конкретного вида устройств) и “публикация” (в противоположность конкретному виду книг или журналов). В программах абстрактные классы обычно определяют интерфейсы групп связанных между собой классов (иерархии классов).

Поделиться:
Популярные книги

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Безымянный раб

Зыков Виталий Валерьевич
1. Дорога домой
Фантастика:
фэнтези
9.31
рейтинг книги
Безымянный раб

Волк 4: Лихие 90-е

Киров Никита
4. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк 4: Лихие 90-е

Кремлевские звезды

Ромов Дмитрий
6. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кремлевские звезды

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

Восход. Солнцев. Книга VIII

Скабер Артемий
8. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга VIII

Кровь и Пламя

Михайлов Дем Алексеевич
7. Изгой
Фантастика:
фэнтези
8.95
рейтинг книги
Кровь и Пламя

Объединитель

Астахов Евгений Евгеньевич
8. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Объединитель

Комбинация

Ланцов Михаил Алексеевич
2. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Комбинация

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Дайте поспать!

Матисов Павел
1. Вечный Сон
Фантастика:
юмористическое фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Дайте поспать!

Бальмануг. Студентка

Лашина Полина
2. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. Студентка

Довлатов. Сонный лекарь

Голд Джон
1. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь

Мастер Разума VII

Кронос Александр
7. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума VII