Общее и частное наследование. Права доступа. Язык С++. (Лекция 8)

Содержание

Слайд 2

Наследование свойств

Поле А
Поле Б
Поле В

Поле А
Поле Б
Поле В
Поле Г

базовый класс

производный класс

определены в

Наследование свойств Поле А Поле Б Поле В Поле А Поле Б
базовом классе, но доступны также в производном классе

определено в производном классе

Слайд 3

Наследование поведения

метод1(…)
метод2(…)
метод3(…)

метод1(...)
метод2(...)
метод3(...)
метод4(...)

базовый класс

производный класс

определены в базовом классе, но доступны также в производном

Наследование поведения метод1(…) метод2(…) метод3(…) метод1(...) метод2(...) метод3(...) метод4(...) базовый класс производный
классе

определен в производном классе

Слайд 4

Права доступа при наследовании

Общее правило:
Методы производного класса имеют доступ к полям и

Права доступа при наследовании Общее правило: Методы производного класса имеют доступ к
методам базового класса только в случае, если в базовом классе они были объявлены как public или protected. К закрытым (private) данным наследник доступа не имеет.

Слайд 5

Ситуация без наследования

Извне можно обращаться только public полям и методам

Методы класса А

Ситуация без наследования Извне можно обращаться только public полям и методам Методы
имеют доступ ко всем полям и методам (public и private)

Слайд 6

Ситуация с общим (public) наследованием

Ситуация с общим (public) наследованием

Слайд 7

Таблица прав доступа при public-наследовании

Таблица прав доступа при public-наследовании

Слайд 8

Пример общего наследования

Класс счетчика (Counter)
Использование: подсчет числа определенных событий (например, числа скачиваний

Пример общего наследования Класс счетчика (Counter) Использование: подсчет числа определенных событий (например,
файла)
Поля:
count – текущее число событий
Методы:
counter(), counter(int) – конструкторы,
operator++() – увеличение счетчика,
get_count() – запрос значения.

Слайд 9

class Counter
{
protected:
unsigned int count;
public:
Counter() : count(0)

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="

int main() { Counter c1; // объект класса Counter cout ++c1; ++c1;
<< c1.get_count();
++c1; ++c1; ++c1;
cout << "\nc1=" << c1.get_count();
cout << endl;
return 0;
}

Использование базового класса

Слайд 11

Производный класс – счетчик с уменьшением

Класс CountDn : наследник Counter
Методы:
operator--() – уменьшение

Производный класс – счетчик с уменьшением Класс CountDn : наследник Counter Методы: operator--() – уменьшение счетчика.
счетчика.

Слайд 12

class CountDn : public Counter
{
public:
Counter operator--()
{
return

class CountDn : public Counter { public: Counter operator--() { return Counter(--count); } }; Производный класс
Counter(--count);
}
};

Производный класс

Слайд 13

int main()
{
CountDn c2;
cout << "\nc2=" << c2.get_count();
++c2; ++c2;

int main() { CountDn c2; cout ++c2; ++c2; ++c2; cout --c2; --c2;
++c2;
cout << "\nc2=" << c2.get_count();
--c2; --c2;
cout << "\nc2=" << c2.get_count();
return 0;
}

Использование производного класса

Слайд 14

Конструктор производного класса
class CountDn : public Counter
{
public:
CountDn() :

Конструктор производного класса class CountDn : public Counter { public: CountDn() :
Counter()
{ }
CountDn(int c) : Counter(c)
{ }
Counter operator--()
{ return Counter(--count); }
};

Слайд 15

Общее и частное наследование

Альтернативой спецификатору доступа public при наследовании является спецификатор private.

Общее и частное наследование Альтернативой спецификатору доступа public при наследовании является спецификатор

При частном (private) наследовании доступ ко всем членам базового класса для объектов производного класса закрыт.


class имя_класса1 : private имя_класса2
{
<объявления полей и методов класса1>
}

Слайд 16

Права доступа

Права доступа

Слайд 17

Пример с общим и частным наследованием
#include
using namespace std;
class

Пример с общим и частным наследованием #include using namespace std; class A
A // базовый класс A
{
private:
int privdataA; // закрытое поле
protected:
int protdataA; // защищенное поле
public:
int publdataA; // закрытое поле
};
class B : public A //общее наследование
{
public:
void funct()
{
int a;
a = privdataA; // ошибка!
a = protdataA; // OK
a = publdataA; // OK
}
};
class С : private A //частное наследование
{
public:
void funct()
{
int a;
a = privdataA; // ошибка!
a = protdataA; // OK
a = publdataA; // OK
}
};
void main()
{
int a;
B objB;
a = objB.privdataA; //ошибка!
a = objB.protdataA; //ошибка!
a = objB.publdataA; //OK
C objC;
a = objC.privdataA; // ошибка!
a = objC.protdataA; // ошибка!
a = objC.publdataA; // ошибка!
}

Слайд 18

Иерархии классов

вертикальные связи в системе

Пример: база данных сотрудников предприятия

Иерархии классов вертикальные связи в системе Пример: база данных сотрудников предприятия

Слайд 19

Множественное наследование

Класс может быть производным от нескольких базовых классов. Такой случай называют

Множественное наследование Класс может быть производным от нескольких базовых классов. Такой случай называют множественным наследованием.
множественным наследованием.

Слайд 20

Синтаксис множественного наследования


class A
{
<поля и методы класса А>

Синтаксис множественного наследования class A { }; class B { }; class
};
class B
{
<поля и методы класса B>
};
class C : public A, public B
{
<поля и методы класса C>
};