Разделы презентаций


Лекция 6. Друзья классов. Производные классы

Содержание

Nortel Networks ConfidentialДрузья классаОбычное объявление функции-члена гарантирует:функция имеет доступ к закрытой части классафункция находится в области видимости классафункция должна вызываться для объектов классаFriend функция обладает только первым свойством.

Слайды и текст этой презентации

Слайд 1Артур Садеков

Лекция 6. Друзья классов. Производные классы.

Артур СадековЛекция 6. Друзья классов. Производные классы.

Слайд 2Nortel Networks Confidential
Друзья класса
Обычное объявление функции-члена гарантирует:
функция имеет доступ к

закрытой части класса
функция находится в области видимости класса
функция должна вызываться

для объектов класса

Friend функция обладает только первым свойством.
Nortel Networks ConfidentialДрузья классаОбычное объявление функции-члена гарантирует:функция имеет доступ к закрытой части классафункция находится в области видимости

Слайд 3Nortel Networks Confidential
Друзья класса. Пример
class Coord {
int x, y,

z;
//...
Coord& operator+=(const Coord&);
friend Coord operator+(Coord, Coord);
};
Coord operator+(Coord

a, Coord b)
{
Coord temp;
temp.x = a.x + b.x;
temp.y = a.y + b.y;
temp.z = a.z + b.z;
return temp;
}

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

Nortel Networks ConfidentialДрузья класса. Примерclass Coord { int x, y, z; //... Coord& operator+=(const Coord&); friend Coord

Слайд 4Nortel Networks Confidential
Друзья класса. Пример-2
class Vector {
float V[4];
//...

friend Vector operator*(const Matrix&, const Vector&);
};

class Matrix {
Vector M[4];

//...
friend Vector operator*(const Matrix&, const Vector&);
};

friend Vector operator*(const Matrix& rm, const Vector& rv)
{
Vector tmp;
//...
tmp.V[i] += rm.M[i].V[j] * rv.V[j];
}
Nortel Networks ConfidentialДрузья класса. Пример-2class Vector { float V[4]; //... friend Vector operator*(const Matrix&, const Vector&);};class Matrix

Слайд 5Nortel Networks Confidential
Классы-друзья
Все методы класса-друга являются функциями-друзьями
Классы друзья используются для

отображения тесно связанных концепций
class List {
friend class List_iterator;
//...
};

Nortel Networks ConfidentialКлассы-друзьяВсе методы класса-друга являются функциями-друзьямиКлассы друзья используются для отображения тесно связанных концепцийclass List { friend

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

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

Слайд 7Nortel Networks Confidential
Введение
Классы используются для моделирования концепций реального и программного

мира
Производные классы предназначены для выражения иерархических отношений, отражения общности классов

Nortel Networks ConfidentialВведениеКлассы используются для моделирования концепций реального и программного мираПроизводные классы предназначены для выражения иерархических отношений,

Слайд 8Nortel Networks Confidential
Производные классы
class Employee {
public:
Employee(string _name,

string _surname);
~Employee();
void hire(Date d);
void

fire(Date d);
string name() const;
string surname() const;
void print() const;
private:
string name, surname;
Date hire_date, fire_date;
};

class Programmer: public Employee
{
public:
Programmer(string _name,
string _surname,
string _team);
~Programmer();
void set_team (string _team);
string team() const;
void print() const;

private:
string team;
};

Nortel Networks ConfidentialПроизводные классыclass Employee {public: Employee(string _name,      string _surname); ~Employee(); void

Слайд 9Nortel Networks Confidential
Производные классы
name
surname
hire_date
fire_date
Employee::
name
surname
hire_date
fire_date
----
team
Programmer:
Employee:
Programmer
Employee
Employee::Employee()
Employee::~Employee()
Employee::hire()
Employee::fire()
Employee::name()
Employee::surname()
Employee::print()

Programmer::Programmer()
Programmer::~Programmer()
Programmer::set_team()
Programmer::team()
Programmer::print()

Programmer::Employee::hire()
Programmer::Employee::fire()
Programmer::Employee::name()
Programmer::Employee::surname()
Programmer::Employee::print()

Nortel Networks ConfidentialПроизводные классыnamesurnamehire_datefire_dateEmployee::namesurnamehire_datefire_date----teamProgrammer:Employee:ProgrammerEmployeeEmployee::Employee()Employee::~Employee()Employee::hire()Employee::fire()Employee::name()Employee::surname()Employee::print()Programmer::Programmer()Programmer::~Programmer()Programmer::set_team()Programmer::team()Programmer::print()Programmer::Employee::hire()Programmer::Employee::fire()Programmer::Employee::name()Programmer::Employee::surname()Programmer::Employee::print()

Слайд 10Nortel Networks Confidential
Производные классы
Date start_date(1,1,2004), end_date(31,12,2007);

Employee emp(“Vasya”, “Pupkin”);
emp.hire(start_date);
cout

prog.team();
prog.print();
prog.Employee::print()
prog.fire(end_date);

Nortel Networks ConfidentialПроизводные классыDate start_date(1,1,2004), end_date(31,12,2007);Employee emp(“Vasya”, “Pupkin”);emp.hire(start_date);cout

Слайд 11Nortel Networks Confidential
Производные классы и указатели
Programmer *prog1 = new Programmer(“Petr”,

“Petrov”, “GM12”);
Employee *emp1 = prog1;
Employee *emp2 = new Employee(“vasya”, “Pupkin”);
Programmer

*prog2 = emp2;
prog2->set_team(“GM00”);

void test_function(Employee& emp);

Programmer prog3(“Ivan”, “Ivanov”, “GM00”);
test_function (prog3);

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

// ошибка

// нет team

// хорошо

// хорошо

Nortel Networks ConfidentialПроизводные классы и указателиProgrammer *prog1 = new Programmer(“Petr”, “Petrov”, “GM12”);Employee *emp1 = prog1;Employee *emp2 =

Слайд 12Nortel Networks Confidential
Функции-члены
class Employee {
string name, surname;
//...
public:
void

print() const;
string surname() const;
};

class Programmer: public Employee { //...
public:

void print() const;
//...
};

void Programmer::print() const
{
cout << surname() << endl;
}

void Programmer::print() const
{
cout << surname << endl;
}

void Programmer::print() const
{
Employee::print();
cout << team << endl;
}

// ошибка !!!

Nortel Networks ConfidentialФункции-членыclass Employee { string name, surname; //...public: void print() const; string surname() const;};class Programmer: public

Слайд 13Nortel Networks Confidential
Функции-члены 2
int main()
{
Employee emp(“Vasya”, “Ivanov”);
Programmer prog(“Petr”,

“Petrov”, “GM12”);

emp.print();
emp.surname();

prog.print();
prog.surname();
}
Vasya Ivanov
Ivanov
Petr Petrov
GM12
Petrov

Nortel Networks ConfidentialФункции-члены 2int main(){ Employee emp(“Vasya”, “Ivanov”); Programmer prog(“Petr”, “Petrov”, “GM12”);  emp.print(); emp.surname();  prog.print();

Слайд 14Nortel Networks Confidential
Конструкторы
class Employee {
string name, surname;
public:
Employee(const string&,

const string&);
};

class Programmer:

public Employee {
string team;
public:
Programmer(const string&,
const string&,
const string&);
//...
};

Employee::Employee(const string& n,
const string& sn)
: name(n), surname(sn)
{ /*...*/ }

Programmer::Programmer(
const string& _name,
const string& _surname,
const string& _team) :
Employee(_name, _surname),
team(_team)
{
//...
}

Nortel Networks ConfidentialКонструкторыclass Employee { string name, surname;public: Employee(const string&,      const string&);};class

Слайд 15Nortel Networks Confidential
Programmer::Programmer(
const string& name,
const string& sname,
const

string& t) :
name(name),
surname(sname),
team(t)
{
//...
}
//

ошибка !

// ошибка !

class Employee {
string name, surname;
public:
Employee(const string&,
const string&);
};

class Programmer:
public Employee {
string team;
public:
Programmer(const string&,
const string&,
const string&);
//...
};

Конструкторы

Nortel Networks ConfidentialProgrammer::Programmer( const string& name, const string& sname, const string& t) :  name(name),  surname(sname),

Слайд 16Nortel Networks Confidential
Копирование
Копируется только Employee-часть Programmer – срезка.
class Employee {

//...
Employee(const Employee&);
Employee& operator=(const Employee&)
};

void f(const Programmer& rPrg)
{

Employee emp = rPrg;
emp = rPrg;
};
Nortel Networks ConfidentialКопированиеКопируется только Employee-часть Programmer – срезка.class Employee { //... Employee(const Employee&); Employee& operator=(const Employee&)};void f(const

Слайд 17Nortel Networks Confidential
class Employee {
string name, surname;
public:
Employee(const Employee&);

Employee& operator=(const Employee&)
//...
};
class Programmer: public Employee {
string team;
public:

Programmer(const Programmer &);
Programmer& operator=(const Programmer &)
//...
};

Копирование (продолжение)

Nortel Networks Confidentialclass Employee { string name, surname;public: Employee(const Employee&); Employee& operator=(const Employee&) //...};class Programmer: public Employee

Слайд 18Nortel Networks Confidential
Копирование (продолжение)
Programmer::Programmer (const Programmer& rp)
: Employee(rp), team(rp.team)
{
}

Programmer&

Programmer::operator=(const Programmer &rp)
{
Employee::operator=(rp);
team = rp.team;
}
operator= не наследуется
Конструкторы не

наследуются

Nortel Networks ConfidentialКопирование (продолжение)Programmer::Programmer (const Programmer& rp) : Employee(rp), team(rp.team){}Programmer& Programmer::operator=(const Programmer &rp){ Employee::operator=(rp); team = rp.team;}operator=

Слайд 19Nortel Networks Confidential
Иерархия классов
class Employee {/*...*/};
class Programmer: public Employee
{/*...*/};
class Team_leader:

public Programmer
{/*...*/};
class Proj_manager: public Employee
{/*...*/};
class Senior_Manager: public Proj_manager
{/*...*/};
class HR_manager: public

Employee
{/*...*/};

Programmer

Employee

Team_leader

Proj_manager

Senior_manager

HR_manager

Nortel Networks ConfidentialИерархия классовclass Employee {/*...*/};class Programmer: public Employee{/*...*/};class Team_leader: public Programmer{/*...*/};class Proj_manager: public Employee{/*...*/};class Senior_Manager: public

Слайд 20Nortel Networks Confidential
Иерархия классов - 2
class Team_leader: public Programmer {
public:

Team_leader(string n, string fn, string t);
bool add_designer(Programmer*);
bool rm_designer(string

fn, string n);
Programmer* get_designer(string fn, string n) const;
private:
list team_list;
};

Team_leader::Team_leader(string n,
string fn,
string t) : Programmer(n, fn, t),
team_list()
{}

Team_leader tm(“Igor”, “Kotov”, “GM12”);
tm.hire(Date(20,3,2008));
cout << tm.name();
tm.set_team(“GM18”);
tm.add_designer(p);
tm.fire(Date());

Nortel Networks ConfidentialИерархия классов - 2class Team_leader: public Programmer {public: Team_leader(string n, string fn, string t); bool

Слайд 21Nortel Networks Confidential
Конец

Nortel Networks ConfidentialКонец

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика