542.50K
Категория: ПрограммированиеПрограммирование

Наследование. Лекция №14

1.

Лекция № 14
Наследование

2.

Зачем ?
Повторное использование кода
экономит время и силы !
Базовый
класс
Производный
класс
Исключение дублирования.

3.

Базовый класс
class person
{
public:
person(char *, char *);
void print_person(void);
private:
char name [64];
char sname[64];
};
person::person(char *n, char *sn)
{
strcpy(name, n);
strcpy(sname, sn);
}
void person::print_person(void)
{
printf("Name......%s\n",name);
printf("Surname...%s\n",sname);
}

4.

Производный класс
class student : public person
{
public:
student(char *, char *, char *);
void print_student(void);
private:
char group[8];
};
student::student(char *n, char *sn, char *gr) : person(n, sn)
{
strcpy(group, gr);
}
void student::print_student(void)
{
print_person();
printf("Group.....%s\n",group);
}

5.

Производный класс
class student : public person
Ключевое слово public, которое предваряет имя
класса person, указывает, что общие (public)
элементы класса person также являются общими и в
классе student.
Private элементы базового класса доступны
производному классу только через интерфейсные
функции базового класса, т.е. напрямую обратиться к
частным элементам базового класса, не получится.

6.

Конструкторы
// ----- Конструктор базового класса
void person::print_person(void)
{
printf("Name......%s\n",name);
printf("Surname...%s\n",sname);
}
...
// ----- Конструктор производного класса
student::student(char *n, char *sn, char *gr) : person(n, sn)
{
strcpy(group, gr);
}
Конструкторы не наследуются, поэтому производный
класс должен иметь собственные конструкторы.
При порождении класса из базового класса,
конструктор производного должен вызвать
конструктор базового класса.

7.

Окончательный вариант программы (1)

8.

Окончательный вариант программы (2)

9.

Конструкторы и Деструкторы
При наследовании конструкторы выполняются в
порядке наследования,
а деструкторы – в обратном порядке.
Если А базовый класс,
В – производный из А,
С – производный из В (А-В-С),
то при создании объекта класса С :
конструктор А - конструктор В - конструктор С.
При разрушении объекта С:
деструктор С - деструктор В - деструктор А.

10.

Конструкторы и Деструкторы

11.

Защищенные элементы protected
Производный класс может обращаться к общим
элементам базового класса и не может обращаться к
частным элементам базового класса напрямую.
Защищенные элементы базового класса
занимают промежуточное положение
между частными и общими.
Если элемент является защищенным, объекты
производного класса могут обращаться к нему, как
будто он является общим. Для оставшейся части
программы защищенные элементы являются как бы
частными.

12.

Использование Protected
class person
{
public:
person(char *, char *);
void print_person(void);
protected:
char name [64];
char sname[64];
};
Если создаём класс, который в дальнейшем
будем использовать, как базовый,
то объявляем в нём
поля protected вместо private.
Иначе объекты производного класса не смогут
обращаться к элементам базового.

13.

Сравнение public, private, protected
private
protected
public
Доступ из тела класса
открыт
открыт
открыт
Доступ из
производных классов
закрыт
открыт
открыт
Доступ из внешних
функций и классов
закрыт
закрыт
открыт

14.

Конфликт имен
C++ всегда использует элементы производного
класса внутри функций производного класса.

15.

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

16.

Наследование методов
Если в классе родителе и в его классах потомках
встречаются методы с одинаковым именем, то для
объектов класса потомка компилятор будет
использовать методы именно класса потомка.
Перегруженные методы класса потомка, могут
вызывать методы класса родителя.

17.

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

18.

Множественное наследование
При множественном наследовании производный
класс получает атрибуты двух или более классов.
При использовании множественного наследования
для порождения класса конструктор производного
класса должен вызвать конструкторы всех базовых
классов.
При порождении класса из производного класса
создается иерархия наследования
(иерархия классов).

19.

Множественное наследование
class monitor
{
public:
monitor(char *, long, int, int);
private:
char type[32] ;
long colors;
int X;
int Y;
};
class mother_board
{
public:
mother_board(int, int, int);
private:
int processor;
int speed;
int RAM;
};

20.

Множественное наследование
class computer : public monitor, public mother_board
{
public:
computer(char *, int, float, char *, long,
int, int, int, int, int);
private:
char name[64];
int hard_disk;
float floppy;
};
...
computer::computer(char *name, int hard_disk, float floppy, char
*screen, long colors, int x_res, int y_res, int processor, int
speed, int RAM) :
monitor(screen, colors, x_res, y_res),
mother_board(processor, speed, ram)
Конструктор класса computer, вызывает конструкторы
классов mother_board и computer_screen

21.

Наследование и статические члены
Появляется ли второй экземпляр
статической переменной-члена
для каждого потомка класса?
Статический элемент –
общий для всех .
English     Русский Правила