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

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

// ...

if (e->type == M) {

manager* p = (manager*)e;

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

// ...

}

}

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

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

Виртуальные функции преодолевают сложности решения с помощью полей типа, позволяя программисту описывать в базовом классе функции, которые можно переопределять в любом производном классе. Компилятор и загрузчик обеспечивают правильное соответствие между объектами и применяемыми к ним функциями.

Например:

struct employee {

employee* next;

char* name;

short department;

// ...

virtual void print();

};

Ключевое слово virtual указывает, что могут быть различные варианты функции print() для разных производных классов, и что поиск среди них подходящей для каждого вызова print() является задачей компилятора. Тип функции описывается в базовом классе и не может переписываться в производном классе. Виртуальная функция должна быть определена для класса, в котором она описана впервые.

Например:

void employee::print()

{

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

// ...

}

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

Например:

struct manager : employee {

employee* group;

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