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

base(char* n, short t);

~base();

};

class derived : public base {

base m;

public:

derived(char* n);

~derived();

};

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

Например:

derived::derived(char* n) : (n,10), m("member",123)

{

// ...

}

Объекты класса конструируются снизу вверх: сначала базовый, потом члены, а потом сам производный класс. Уничтожаются они в обратном порядке: сначала сам производный класс, потом члены а потом базовый.

Поля Типа

Чтобы использовать производные классы не просто как удобную сокращенную запись в описаниях, надо разрешить следующую проблему: Если задан указатель типа base*, какому производному типу в действительности принадлежит указываемый объект? Есть три основных способа решения этой проблемы:

Обеспечить, чтобы всегда указывались только объекты одного типа ;

Поместить в базовый класс поле типа, которое смогут просматривать функции; и

Использовать виртуальные функции . Обыкновенно указатели на базовые классы используются при разработке контейнерных (или вмещающих) классов: множество, вектор, список и т.п. В этом случае решение 1 дает однородные списки, то есть списки объектов одного типа. Решения 2 и 3 можно использовать для построения неоднородных списков, то есть списков объектов (указателей на объекты) нескольких различных типов. Решение 3 - это специальный вариант решения 2, безопасный относительно типа.

Давайте сначала исследуем простое решение с помощью поля типа, то есть решение 2. Пример со служащими и менеджерами можно было бы переопределить так:

enum empl_type { M, E };

struct employee {

empl_type type;

employee* next;

char* name;

short department;

// ...

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