Программирование >>  Расширенная версия языка c++ 

1 ... 64 65 66 [ 67 ] 68 69 70 ... 227


Перегруженный оператор + должен поэлементно складывать оба операнда. Перегруженный оператор - должен вгчитать все элементы правого операнда из элементов левого. Перегруженный оператор =~ должен возвращать значение trne, если все элементы обоих операндов равны, в противном случае он должен возвращать значение false. i<

5. Переработайте решение упражнения 4 так, чтобы перегрузить операторы с использованием дружественных функций.

6. Используя класс и функции из вопроса 4, перегрузите оператор ++ с помощью функции - члена класса, а оператор - с помощью дружественной функции. (Перегрузите только префиксные формы операторов ++ и -.)

7. Можно ли, используя дружественную функцию, перегрузить оператор

присваивания?

7.1. Управление доступом к базовому классу

Когда один класс наследуется гим, используется следующая основная форма записи:

Glass шля производного клясся: базового класаа (

Здесь оступа - это одно из трех ключевых слов: public, private или protected. Обсуждение спецификатора доступа protected отложим до следующего раздела этой главы. Здесь рассмотрим спецификаторы public и private.

Спецификатор доступа (access specifier) определяет то, как элементы базового класса (base class) наследуются производным классом (derived class). Если спецификатором доступа наследуемого базового класса является ключевое слово public, то все открытые члены базового класса остаются открытыми и в производном. Если спецификатором доступа наследуемого базового класса является ключевое слово private, то все открытые члены базового класса в производном классе становятся закрытыми. В обоих случаях все закрытые члены базового класса в производном классе остаются закрытгми и недоступнгми.

Важно понимать, что если спецификатором доступа является ключевое слово private, то хотя открытые члены базового класса становятся закрытыми в производном, они остаются доступными для функций - членов производного класса.



Технически спецификатор доступа не обязателен. Если спецификатор доступа не указан и производный класс определен с ключевым словом class, то базовый класс по умолчанию наследуется как закрытый. Если спецификатор доступа не указан и производный класс определен с ключевым словом struct, то базовый класс по умолчанию наследуется как открытый. Тем не менее, для ясности большинство программистов предпочитают явное задание спецификатора доступа.

1. Здесь представлены базовый и наследующий его производный (наследование со спецификатором public):

классы

#include <iostream>

using namespace std;

class base {

int x; public:

voi {int n) { x n; }

void showxO ( cout x \n; }

Класс наследуется как открытый ..class derived: public base {

int y; public:

voi int n) { у .= n; }

void showy {) { cout у \n; }

int mainO

derived ob;

ob.setx(lO); доступ к члену базового класса ob.sety(20); /, доступ к члену производного класса

доступ к члену базового класса

доступ к члену производного класса

return 0;

Как показано в программе, поскольку класс base наследуется как открытый, открытые члены класса base - функции setx() и showxO - становятся открытыми производного класса derived и поэтому доступны из любой части



Глава 7. Наследование 209

программы мтельно, совершенно правильно вызывать эти функции из функции mainO.

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

class base {

int х;

public: , . , ,.Lv

voi int n) { x n; }

voi wx{} { cou x \n; }

1

Клас дуется как открыть! class derived lic base {

int y; public:

void n) { у n; }

/* Закрытые члены базового класса тупны. х - это закрытый член базового класса и поэтому внутри производного класса он недоступен */

void show sum() { cout х+у \n; } Ошибка! I !

void { cout у }

у> . ..

Здесь в производном классе derived сделана попытка доступа к переменной х, которая является закрытым членом базового класса base. Это неверно, поскольку закрытые члены базового класса остаются закрытыми, независимо от того, как он наследуется.

3. Ниже представлена слегка измененная версия программы из примера 1. Базовый класс base наследуется как закрытый, т. е. с ключевым словом private. Такое изменение, как показано в комментариях, при компиляции ведет к ошибке. . . . . .-, ,

в этой программе есть ошибка ftinclude <iostreain>

using namespace std; лгг?

class base {

int x; public:

voi intn) ( x = n; }

void showxO { cout x Лп; }



1 ... 64 65 66 [ 67 ] 68 69 70 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика