Наследование в программировании

Содержание

Слайд 2

Наследование Базовый класс ________ private: protected: public: Произ-вольный класс Класс-наследник

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

Базовый класс
________
private:
protected:
public:

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

Класс-наследник

Слайд 3

Создание класса-наследника в С++ // базовый класс class A { ...

Создание класса-наследника в С++

// базовый класс
class A
{
...
} ;
//класс-наследник
class B : public

A
{
...
} ;
Слайд 4

Пример базового класса class Person { protected: char Name[30]; public: Person

Пример базового класса

class Person
{
protected:
char Name[30];
public:
Person ();
void SetName (char* );
void Show ();
}

;
Слайд 5

Класс-наследник class Student : public Person { char dept[30]; public: Student

Класс-наследник

class Student : public Person
{
char dept[30];
public:
Student (char*, char* );
void SetDept (char*

);
void Show ();
} ;
Слайд 6

Методы класса Person Person::Person() { } void Person::SetName (char* N) {

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

Person::Person()
{
}
void Person::SetName (char* N)
{
strcpy (Name, N);
}
void Person::Show ()
{
std::cout <<

“My name is ” << Name << std::endl;
}
Слайд 7

Собственные методы класса Student Student::Student (char* N, char* D) { strcpy

Собственные методы класса Student

Student::Student (char* N, char* D)
{
strcpy (Name, N);
strcpy (Dept,

D);
}
void Student::SetDept (char* D)
{
strcpy (Dept, D);
}
void Student::Show ()
{
std::cout << Name << “ “ << Dept << std::endl;
}
Слайд 8

Текст программы int main () { Person A; A.SetName (“Tom”); Student

Текст программы

int main ()
{
Person A;
A.SetName (“Tom”);
Student B(“Ann”, “MTS”);
A.Show ();
B.Show ();
Person* pperson

= &B;
Student* pstudent = &B;
pperson->Show ();
pstudent->Show ();
B.SetName (“Kate”);
B.SetDept (“GF”);
pstudent->Show ();
return 0;
}

На экране:
My name is Tom
Ann MTS
My name is Ann
Ann MTS
Kate GF

Слайд 9

Виртуальная функция class Person { char Name[30]; public: Person (char* );

Виртуальная функция

class Person
{
char Name[30];
public:
Person (char* );
void SetName (char* );
virtual void Show

();
} ;
Слайд 10

Текст программы int main () { Person A; A.SetName (“Tom”); Student

Текст программы

int main ()
{
Person A;
A.SetName (“Tom”);
Student B(“Ann”, “MTS”);
A.Show ();
B.Show ();
Person* pperson

= &B;
Student* pstudent = &B;
pperson->Show ();
pstudent->Show ();
B.SetName (“Kate”);
B.SetDept (“GF”);
pstudent->Show ();
return 0;
}

На экране:
My name is Tom
Ann MTS
Ann MTS
Ann MTS
Kate GF

Слайд 11

Полиморфизм Статический полиморфизм — поддерживается посредством перегрузки функций и операторов во

Полиморфизм

Статический полиморфизм — поддерживается посредством перегрузки функций и операторов во время

компиляции
Динамический полиморфизм — поддерживается посредством виртуальных функций во время выполнения программы
Слайд 12

Конструкторы и наследование class Person { protected: char Name[30]; public: Person

Конструкторы и наследование

class Person
{
protected:
char Name[30];
public:
Person (char*); //конструктор с параметром
void SetName (char*

);
void Show ();
} ;
Слайд 13

Реализация конструкторов Person::Person (char* N) { strcpy (Name, N); } Student::Student

Реализация конструкторов

Person::Person (char* N)
{
strcpy (Name, N);
}
Student::Student (char* N, char* D) :

Person (N)
{
strcpy (Dept, D);
}
Слайд 14

Язык UML UML: Unified Modeling Language Стандарты: 1.0, 2.0 Назначение: графический

Язык UML

UML: Unified Modeling Language
Стандарты: 1.0, 2.0
Назначение: графический язык для визуализации,

конструирования и документирования систем, в т.ч. программного обеспечения
Разработчики: Грейди Буч, Джеймс Рамбо, Айвар Джекобсон
Элементы языка: диаграммы и их компоненты (предметы, отношения)
Слайд 15

Диаграммы UML Структурные диаграммы Диаграмма компонентов Диаграмма классов Диаграмма объектов Диаграмма

Диаграммы UML

Структурные диаграммы
Диаграмма компонентов
Диаграмма классов
Диаграмма объектов
Диаграмма развертывания
Диаграммы поведения
Диаграмма прецедентов
Диаграмма последовательности
Диаграмма состояний

Слайд 16

Диаграмма классов Упрощенное обозначение Полное обозначение Обозначение класса на UML-диаграммах:

Диаграмма классов
Упрощенное обозначение
Полное обозначение

Обозначение класса на UML-диаграммах:

Слайд 17

Взаимодействие классов Виды взаимодействия: Наследование Агрегация (включение) Использование (клиент-серверное взаимодействие) Ассоциация

Взаимодействие классов

Виды взаимодействия:
Наследование
Агрегация (включение)
Использование (клиент-серверное взаимодействие)
Ассоциация

Слайд 18

Наследование Класс-наследник class A { // . . . } ;

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

Класс-наследник
class A
{
// . . .
} ;
class B : public A
{
//

. . .
} ;

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

Слайд 19

Агрегация class A { // . . . public: void Message

Агрегация

class A
{
// . . .
public:
void Message ( );
} ;
class B
{
//

. . .
A a;
} ;
int main ( )
{
B b ;
// . . .
b . a . Message ( );
// . . .
}

Внешний класс

Внутренний класс

Слайд 20

Использование class A { // . . . } ; class

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

class A
{
// . . .
} ;
class B
{
// . . .
public:
void

Fn ( A*) ;
} ;
int main ( )
{
A a;
B b ;
// . . .
b . Fn ( &a );
// . . .
}

Сервер

Клиент

Слайд 21

Ассоциация int main ( ) { A a; B b ;

Ассоциация

int main ( )
{
A a;
B b ;
// . .

.
b.pa = &a;
a.pb = &b;
// . . .
}

Пример связи один-к-одному

class B
{
// . . .
public:
A* pa;
} ;

class A
{
// . . .
public:
B* pb;
} ;

Мощность связи:
Один-к-одному
Один-ко-много
Много-ко-много

1 1

Слайд 22

Пример диаграммы классов Факультет Группа 1 N 1 1 N N Лектор Студент Библиотека Person Ст.билет

Пример диаграммы классов
Факультет Группа
1 N
1
1

N N
Лектор Студент Библиотека
Person Ст.билет
Слайд 23

Друзья класса class First { int x; public: void SetX (int);

Друзья класса

class First
{
int x;
public:
void SetX (int);
friend class Second;
friend void Set_X (First&,

int);
} ;
void First::SetX (int xx)
{
x = xx;
}
Слайд 24

Друзья : глобальная функция или класс class Second { // .

Друзья : глобальная функция или класс

class Second
{
// . . .
public:
void SetX

(First&, int);
} ;
void Second::SetX (First& f, int xx)
{
f.x = xx;
}
void Set_X (First& f, int xx)
{
f.x = xx;
}

int main ()
{
First first;
first.SetX (10);
first.Show ();
Second second;
second.SetX (first, 20);
first.Show ();
Set_X (first, 30);
first.Show ();
}
На экране:
10
20
30

Слайд 25

Указатель this class A { public: void Greet (); void Prim

Указатель this

class A
{
public:
void Greet ();
void Prim ();
//. . .
} ;

void A::Prim

()
{
Greet ();
this->Greet ();
(*this).Greet ();
//. . .
} ;
Слайд 26

Перегрузка операторов Встроенные перегружаемые операторы: = == != = + -

Перегрузка операторов

Встроенные перегружаемые операторы: = == != < > <= >=

+ - * / ++(инкремент) –(декремент) <<(вывод) >>(ввод) += -= и т.д.
Встроенные неперегружаемые операторы: . :: ?: (оператор условия)
Операторные функции:
<возвр_тип> operatorX(<тип_парам>);
Глобальная функция:
MyClass operator+(MyClass&,MyClass&);
Функция-член класса:
MyClass MyClass::operator+(MyClass&);
Слайд 27

Глобальные операторные функции bool operator==(MyClass, MyClass); // != MyClass operator+(MyClass&, AnyType);

Глобальные операторные функции

bool operator==(MyClass, MyClass); // != < >
MyClass operator+(MyClass&, AnyType);

// - * /
istream& operator>> (istream&, MyClass&);
ostream& operator<< (ostream&,const MyClass&);
Слайд 28

Функции-члены класса bool operator==(MyClass); // != MyClass operator+(AnyType); // - *

Функции-члены класса

bool operator==(MyClass); // != < >
MyClass operator+(AnyType); // - *

/
MyClass& operator++(); // - - (++a)
MyClass operator++(int); // - - (a++)
MyClass& operator=(MyClass&);
MyClass& operator+=(AnyType); // -=
Слайд 29

Результат работы программы

Результат работы программы

Слайд 30

Person.h #pragma once #include class person { char Name[20]; int Year;

Person.h

#pragma once
#include
class person
{
char Name[20];
int Year;
public:
person(void);
person(char* N, int Y);
bool operator==(person&); //оператор

отношения
person operator+(int); //сложение
int operator-(person&); //Вычитание - результат в виде
//целого числа
person& operator++(); //Префиксный инкремент
person& operator=(person&); //Присваивание
//Перегрузка ввода через объект класса istream (cin)
friend std::istream& operator>>(std::istream&,person&);
//Перегрузка вывода через объект класса ostream (cout)
friend std::ostream& operator<<(std::ostream&,const person&);
};
Слайд 31

main.cpp #include "person.h" int main(int argc, char* argv[]) { person My1,

main.cpp

#include "person.h"
int main(int argc, char* argv[])
{
person My1, My2("Nick",1989);
std::cin >>

My1;
std::cout << "My1: " << My1;
std::cout << "My2: " << My2 < person My3;
My3=My1;
std::cout << "My3=My1: " << My3;
person My4=My3+6;
std::cout << "My4: " << My4;
int diff=My4-My2;
std::cout << "Diff=" << diff << std::endl;
std::cout << " Prefix: ++My2 " << ++My2;
std::cout << "My1==My3 " << (My1==My3) < return 0;
}
Слайд 32

Person.cpp (1) #include ".\person.h" #include person::person(void) { strcpy(Name, ''Noname''); Year=0; }

Person.cpp (1)

#include ".\person.h"
#include
person::person(void)
{
strcpy(Name, ''Noname'');
Year=0;
}
person::person(char* N, int Y)
{
strcpy(Name,

N);
Year=Y;
}
bool person::operator==(person& p)
{
bool cmp =!strcmp(Name,p.Name)&&Year==p.Year;
return cmp;
}
Слайд 33

Person.cpp (2) person person::operator+(int Y) { person Temp; Temp.Year= Year+Y; strcpy(Temp.Name,Name);

Person.cpp (2)

person person::operator+(int Y)
{
person Temp;
Temp.Year= Year+Y;
strcpy(Temp.Name,Name);
return Temp;
}
int person::operator-(person&

p)
{
int Temp;
Temp=Year-p.Year;
return Temp;
}
Слайд 34

Person.cpp (3) person& person::operator++() { Year++; return *this; } person& person::operator=(person&

Person.cpp (3)

person& person::operator++()
{
Year++;
return *this;
}
person& person::operator=(person& p)
{
if (this==&p)
return

*this;
strcpy(Name, p.Name);
Year=p.Year;
return *this;
}
Слайд 35

Person.cpp (4) std::istream& operator>>(std::istream& is,person& p) { char buf[20]; int Y;

Person.cpp (4)

std::istream& operator>>(std::istream& is,person& p)
{
char buf[20]; int Y;
std::cout <<

"Name->";
is>>buf; strcpy(p.Name,buf);
std::cout << "Year->";
is >> Y; p.Year = Y;
return is;
}
std::ostream& operator<<(std::ostream& os,const person& p)
{
os << "Name " << p.Name << " Year " << p.Year << std::endl;
return os;
}