Similar presentations:
Общее и частное наследование. Права доступа. Язык С++. (Лекция 8)
1.
Лекция 8Общее и частное
наследование.
Права доступа
2.
Наследование свойствбазовый класс
производный класс
Поле А
Поле А
Поле Б
Поле Б
Поле В
Поле В
Поле Г
определены в
базовом классе,
но доступны
также в
производном
классе
определено в
производном
классе
3.
Наследование поведениябазовый класс
производный класс
метод1(…)
метод1(...)
метод2(…)
метод2(...)
метод3(…)
метод3(...)
метод4(...)
определены в
базовом классе,
но доступны
также в
производном
классе
определен в
производном
классе
4.
Права доступа при наследованииОбщее правило:
Методы производного класса имеют доступ к полям и
методам базового класса только в случае, если в
базовом классе они были объявлены как public или
protected. К закрытым (private) данным наследник
доступа не имеет.
5.
Ситуация без наследованияМетоды класса
А имеют доступ
ко всем полям и
методам (public
и private)
Извне можно
обращаться
только public
полям и методам
6.
Ситуация с общим (public)наследованием
7.
Таблица прав доступа приpublic-наследовании
доступ из
базового
класса
доступ из
производных
классов
доступ из
внешних
функций
public
+
+
+
protected
+
+
-
private
+
-
-
спецификатор
доступа
8.
Пример общего наследованияКласс счетчика (Counter)
Использование: подсчет числа
определенных событий (например,
числа скачиваний файла)
Поля:
count – текущее число событий
Методы:
counter(), counter(int) – конструкторы,
operator++() – увеличение счетчика,
get_count() – запрос значения.
9.
Базовый класс счетчикаclass Counter
{
protected:
unsigned int count;
public:
Counter() : count(0)
{ }
Counter(int c) : count(c)
{ }
unsigned int get_count() const
{ return count; }
Counter operator++()
{ return Counter(++count); }
};
10.
Использование базового классаint main()
{
Counter c1;
// объект класса Counter
cout << "\nc1=" << c1.get_count();
++c1; ++c1; ++c1;
cout << "\nc1=" << c1.get_count();
cout << endl;
return 0;
}
11.
Производный класс – счетчик с уменьшениемКласс CountDn : наследник Counter
Методы:
operator--() – уменьшение счетчика.
12.
Производный классclass CountDn : public Counter
{
public:
Counter operator--()
{
return Counter(--count);
}
};
13.
Использование производного классаint main()
{
CountDn c2;
cout << "\nc2=" << c2.get_count();
++c2; ++c2; ++c2;
cout << "\nc2=" << c2.get_count();
--c2; --c2;
cout << "\nc2=" << c2.get_count();
return 0;
}
14.
Конструктор производного классаclass CountDn : public Counter
{
public:
CountDn() : Counter()
{ }
CountDn(int c) : Counter(c)
{ }
Counter operator--()
{ return Counter(--count); }
};
15.
Общее и частное наследованиеАльтернативой спецификатору доступа public при
наследовании является спецификатор private.
class имя_класса1 : private имя_класса2
{
<объявления полей и методов класса1>
}
При частном (private) наследовании доступ ко всем
членам базового класса для объектов производного
класса закрыт.
16.
Права доступа17.
Пример с общим и частнымнаследованием
#include
<iostream>
void main()
classnamespace
B : public
A
//общее наследование
using
std;
{ class
С : private A
//частное наследование
{
{int
class
A a;
// базовый класс A
public:
{ B public:
objB;
void funct()
void funct()
private:
a = {objB.privdataA;
//ошибка!
{ privdataA;
//
закрытое поле
a int
= objB.protdataA;
//ошибка!
int a;
a;
protected:
a = objB.publdataA;
//OK// ошибка!
a int
= privdataA;
privdataA; // защищенное
int protdataA;
поле
a a= =protdataA;
////OKошибка!
C objC; a = protdataA;
public:
a = publdataA;
////OKOK
a int
= objC.privdataA;
// закрытое
ошибка!
a = publdataA; //
// OK поле
} publdataA;
// ошибка!
}
};};a = objC.protdataA;
a = objC.publdataA;
// ошибка!
};
}
18.
Иерархии классовПример: база данных сотрудников предприятия
вертикальные
связи в системе
19.
Множественное наследованиеКласс может быть производным от нескольких
базовых классов. Такой случай называют
множественным наследованием.
20.
Синтаксис множественногонаследования
class A
{
<поля и методы класса А>
};
class B
{
<поля и методы класса B>
};
class C : public A, public B
{
<поля и методы класса C>
};
programming