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


Лекция 7. Производные классы. Часть 2

Nortel Networks ConfidentialВиртуальные функцииИнтерфейсные функции (public)Их можно заместить в каждом производном классеclass Employee {public: Worker(string _name, string _surname); // ... virtual void print() const;private: string name, surname;

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

Слайд 1Лекция 7. Производные классы. Часть 2.
Артур Садеков

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

Слайд 2Nortel Networks Confidential
Виртуальные функции
Интерфейсные функции (public)
Их можно заместить в каждом

производном классе
class Employee {
public:
Worker(string _name,

string _surname);

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

private:
string name, surname;
Date hire_date, fire_date;
};

class Programmer: public Employee
{
public:
Programmer(string _name,
string _surname,
string _team);

virtual void print() const;

private:
string team;
};

Nortel Networks ConfidentialВиртуальные функцииИнтерфейсные функции (public)Их можно заместить в каждом производном классеclass Employee {public: Worker(string _name,

Слайд 3Nortel Networks Confidential
Пример
void Employee::print() const
{
cout

<< “team: ” << team << endl;
}
Nortel Networks ConfidentialПримерvoid Employee::print() const{ cout

Слайд 4Nortel Networks Confidential
Пример (продолжение)
void print_emp(const Employee* pEmp)
{
cout

info:” print();
}
int main()
{
Employee emp(“Vassya”, “Pupkin”);
Programmer prog(“Ivan”,

“Sidorov”, “GM12”);
print_emp ( &emp );
print_emp ( &prog );
return 0;
}

Employee info:
Vassya Pupkin

Employee info:
Ivan Sidorov
team: GM12

Nortel Networks ConfidentialПример (продолжение)void print_emp(const Employee* pEmp){ cout

Слайд 5Nortel Networks Confidential
Virtual function table (vtbl)
vtbl:
Объект класса Programmer
Объект класса Employee

Nortel Networks ConfidentialVirtual function table (vtbl)vtbl:Объект класса ProgrammerОбъект класса Employee

Слайд 6Nortel Networks Confidential
Когда используется виртуальность
Employee emp(“Vasya”, “Pupkin”);
Programmer prog(“Ivan”, “Sidorov”, “GM12”);
emp.print();

// нет, Employee::print()
prog.print(); // нет, Programmer::print()
void fn1(Employee *p)
{
p->print(); //

да
p->hire(); // да
}

void fn2(Employee &r)
{
r.print(); // да
r.fire(); // да
}

Механизм виртуальности используется, только когда вирт. функция вызывается через указатель или ссылку на базовый класс.

{
fn1(&emp);
fn1(&prog);

fn2(emp);
fn2(prog);
}

Nortel Networks ConfidentialКогда используется виртуальностьEmployee emp(“Vasya”, “Pupkin”);Programmer prog(“Ivan”, “Sidorov”, “GM12”);emp.print(); // нет, Employee::print()prog.print(); // нет, Programmer::print()void fn1(Employee

Слайд 7Nortel Networks Confidential
Более сложный пример
// массив указателей на Employee, размер
void

give_a_bonus(Employee *list[], int size)
{
for(int i=0; (ibonus();
}
void

create_lucky_list_and_give_bonus()
{
Employee **list = new (Employee*) [10];
for(int i=0; i<10; ++i)
list[i] = next_lucky_man();
give_a_bonus(list);
}
Nortel Networks ConfidentialБолее сложный пример// массив указателей на Employee, размерvoid give_a_bonus(Employee *list[], int size){ for(int i=0; (ibonus();}void

Слайд 8Nortel Networks Confidential
Более сложный пример - 2
class Unit {
public:

virtual bool action()
{return

false};
};
class Soldier: public Unit {/*...*/};
class Tank : public Unit {/*...*/};
class Mine : public Unit {/*...*/};

void Field::turn()
{
for(int i=0; i if ( units[i]->action() != true)
move_to_end(units[i]);
}

class Field
{
public:
Field();
~Field();
void refresh_field();
void turn();
void move_to_end(Unit*);

private:
int unit_number;
Unit **units;
//...
}

Nortel Networks ConfidentialБолее сложный пример - 2class Unit {public:  virtual bool action()

Слайд 9Nortel Networks Confidential
Абстрактные классы
class Cosmetics {
public:
virtual void make_up() =

0;
virtual void touch_up() = 0;
virtual void remove() =

0;
};

class Mascara :
public Cosmetics {
public:
virtual void make_up();
virtual void touch_up();
};

class Lipstick :
public Cosmetics {
public:
virtual void make_up();
virtual void touch_up();
virtual void remove();
};

class WaterRes_Mascara :
public Mascara {
public:
virtual void remove();
};

class Plain_Mascara :
public Mascara {
public:
virtual void remove();
};

Nortel Networks ConfidentialАбстрактные классыclass Cosmetics {public: virtual void make_up() = 0; virtual void touch_up() = 0; virtual

Слайд 10Nortel Networks Confidential
Абстрактные классы (продолжение)
Cosmetics cosmo;
Lipstick lips;
Mascara masc;
WaterRes_Mascara wr_masc;
Plain_Mascara plain_masc;
void

complete_touch_up(Cosmetics* todo[], int n)
{
for (int i=0; (i

++i)
{
todo[i]->touch_up();
}
}

// ошибка !!!

// ошибка !!!

Nortel Networks ConfidentialАбстрактные классы (продолжение)Cosmetics cosmo;Lipstick lips;Mascara masc;WaterRes_Mascara wr_masc;Plain_Mascara plain_masc;void complete_touch_up(Cosmetics* todo[], int n){ for (int i=0;

Слайд 11Nortel Networks Confidential
class Shaver {
public:
virtual void shave() = 0;

virtual void reload() = 0;
virtual void clean() = 0;
};
class

Razor :
public Shaver {
public:
virtual void clean();
};

class Electric_Shaver :
public Shaver {
public:
virtual void shave();
virtual void reload() {}
virtual void clean();
};

class Safe_Razor :
public Razor {
public:
virtual void shave();
virtual void reload();
};

class Blade :
public Razor {
public:
void shave();
virtual void reload() {...}
};

Nortel Networks Confidentialclass Shaver {public: virtual void shave() = 0; virtual void reload() = 0; virtual void

Слайд 12Nortel Networks Confidential
Абстрактные классы (продолжение)
Абстрактный класс – это чистый интерфейс
Класс

асбтрактный, если есть хотя бы одна чисто виртуальная функция (=0)
Нельзя

создать экземпляр абстрактного класса
Чисто виртуальная фнкция, которая не определена в производном классе, остается чисто виртуальной
Nortel Networks ConfidentialАбстрактные классы (продолжение)Абстрактный класс – это чистый интерфейсКласс асбтрактный, если есть хотя бы одна чисто

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

Nortel Networks ConfidentialКонец

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

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

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

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

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


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

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