Основы программирования

Новые типы С++ - Указатели
Индекс материала
Новые типы С++
Классы и Члены
Классы
Инициализация
Очистка
Интерфейсы и Реализации
Законченный Класс
Друзья и Объединения
Вложенные Классы
Структуры и Объединения
Конструкторы и Деструкторы
Предостережение
Свободная Память
Вектора Объектов Класса
Небольшие Объекты
Предостережение
Упражнения
Перегрузка Операций
Функции Операции
Предопределенный Смысл Операций
Конструкторы
Константы
Присваивание и Инициализация
Индексирование
Вызов Функции
Класс String
Синтаксис вызова функции
Предостережение
Упражнения
Производные Классы
Производные Классы
Функции
Видимость
Указатели
Иерархия Типов
Конструкторы и Деструкторы
Поля Типа
Виртуальные Функции
Альтернативные Интерфейсы
Реализация
Как Этим Пользоваться
Обработка Ошибок
Обобщенные Классы
Ограниченные Интерфейсы
Добавление к Классу
Неоднородные Списки
Администратор Экрана
Библиотека Фигур
Прикладная Программа
Свободная Память
Упражнения
Все страницы

7.2.4 Указатели

Если производный класс derived имеет открытый базовый класс base, то указатель на derived можно присваивать перменной типа указатель на base не используя явное преобразовние типа. Обратное преобразование, указателя на base в указтель на derived, должно быть явным. Например:

class base (* /* ... */ *); class derived : public base (* /* ... */ *);

derived m; base* pb = amp;m; // неявное преобразование derived* pd = pb; // ошибка: base* не является derived* pd = (derived*)pb; // явное преобразование

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

Будь base закрытым базовым классом класса derived, неяное преобразование derived* в base* не делалось бы. Неявное преобразование не может в этом случае быть выполнено, потому что к открытому члену класса base можно обращаться через укзатель на base, но нельзя через указатель на derived:

class base (* int m1; public: int m2; // m2 – открытый член base *);

class derived : base (* // m2 – НЕ открытый член derived *);

derived d; d.m2 = 2; // ошибка: m2 из закрытой части класса base* pb = amp;d; // ошибка: (закрытый base) pb-»m2 = 2; // ok pb = (base*) amp;d; // ok: явное преобразование pb-»m2 = 2; // ok

Помимо всего прочего, этот пример показывает, что ипользуя явное приведение к типу можно сломать правила защиты. Ясно, делать это не рекомендуется, и это приносит программиту заслуженную «награду». К несчастью , недисциплинированное использование явного преобразования может создать адские уловия для невинных жертв, эксплуатирующих программу, в котрой это делается. Но, к счастью, нет способа воспользоваться приведением для получения доступа к закрытому имени m1. Зарытый член класса может использоваться только членами и друзьями этого класса.




 
Дача: скандинавские технологии - дома из оцилиндрованного бревна цены.