Статья: Производные Классы

struct manager : employee {

employee* group;

short level; // уровень

};

Имея это, мы можем теперь написать функцию, которая печатает информацию о каждом служащем:

void print_employee(employee* e)

{

switch (e->type) {

case E:

cout << e->name << "\t" << e->department << "\n";

// ...

break;

case M:

cout << e->name << "\t" << e->department << "\n";

// ...

manager* p = (manager*)e;

cout << " уровень " << p->level << "\n";

// ...

break;

}

}

и воспользоваться ею для того, чтобы напечатать список служащих:

void f()

{

for (; ll; ll=ll->next) print_employee(ll);

}

Это прекрасно работает, особенно в небольшой программе, написанной одним человеком, но имеет тот коренной недостаток, что неконтролируемым компилятором образом зависит от того, как программист работает с типами. В больших программах это обычно приводит к ошибкам двух видов. Первый - это невыполнение проверки поля типа, второй - когда не все случаи case помещаются в переключатель switch как в предыдущем примере. Оба избежать достаточно легко , когда программу сначала пишут на бумаге $, но при модификации нетривиальной программы, особенно написанной другим человеком, очень трудно избежать и того, и другого. Часто от этих сложностей становится труднее уберечься из-за того, что функции вроде print() часто бывают организованы так, чтобы пользоваться общность классов, с которыми они работают.

Например:

void print_employee(employee* e)

К-во Просмотров: 585
Бесплатно скачать Статья: Производные Классы