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

Содержание

Слайд 2

Nortel Networks Confidential

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

Интерфейсные функции (public)
Их можно заместить в каждом производном классе

class

Nortel Networks Confidential Виртуальные функции Интерфейсные функции (public) Их можно заместить в
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;
};

Слайд 3

Nortel Networks Confidential

Пример

void Employee::print() const
{
cout << first_name << “ ” <<

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

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

Слайд 4

Nortel Networks Confidential

Пример (продолжение)

void print_emp(const Employee* pEmp)
{
cout << “Employee info:” <<

Nortel Networks Confidential Пример (продолжение) void print_emp(const Employee* pEmp) { cout pEmp->print();
endl;
pEmp->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

Слайд 5

Nortel Networks Confidential

Virtual function table (vtbl)

vtbl:

Объект класса Programmer

Объект класса Employee

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

Слайд 6

Nortel Networks Confidential

Когда используется виртуальность

Employee emp(“Vasya”, “Pupkin”);
Programmer prog(“Ivan”, “Sidorov”, “GM12”);
emp.print(); // нет,

Nortel Networks Confidential Когда используется виртуальность Employee emp(“Vasya”, “Pupkin”); Programmer prog(“Ivan”, “Sidorov”,
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);
}

Слайд 7

Nortel Networks Confidential

Более сложный пример

// массив указателей на Employee, размер
void give_a_bonus(Employee *list[],

Nortel Networks Confidential Более сложный пример // массив указателей на Employee, размер
int size)
{
for(int i=0; (i list[i]->bonus();
}

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);
}

Слайд 8

Nortel Networks Confidential

Более сложный пример - 2

class Unit {
public:
virtual bool action()

Nortel Networks Confidential Более сложный пример - 2 class Unit { public:
{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;
//...
}

Слайд 9

Nortel Networks Confidential

Абстрактные классы

class Cosmetics {
public:
virtual void make_up() = 0;
virtual

Nortel Networks Confidential Абстрактные классы class Cosmetics { public: virtual void make_up()
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();
};

Слайд 10

Nortel Networks Confidential

Абстрактные классы (продолжение)

Cosmetics cosmo;
Lipstick lips;
Mascara masc;
WaterRes_Mascara wr_masc;
Plain_Mascara plain_masc;

void complete_touch_up(Cosmetics* todo[],

Nortel Networks Confidential Абстрактные классы (продолжение) Cosmetics cosmo; Lipstick lips; Mascara masc;
int n)
{
for (int i=0; (i {
todo[i]->touch_up();
}
}

// ошибка !!!

// ошибка !!!

Слайд 11

Nortel Networks Confidential

class Shaver {
public:
virtual void shave() = 0;
virtual void

Nortel Networks Confidential class Shaver { public: virtual void shave() = 0;
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() {...}
};

Слайд 12

Nortel Networks Confidential

Абстрактные классы (продолжение)

Абстрактный класс – это чистый интерфейс
Класс асбтрактный, если

Nortel Networks Confidential Абстрактные классы (продолжение) Абстрактный класс – это чистый интерфейс
есть хотя бы одна чисто виртуальная функция (=0)
Нельзя создать экземпляр абстрактного класса
Чисто виртуальная фнкция, которая не определена в производном классе, остается чисто виртуальной
Имя файла: Производные-классы.-Часть-2.pptx
Количество просмотров: 115
Количество скачиваний: 0