Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP / lectures / 5_oop.ppt
Скачиваний:
113
Добавлен:
03.03.2016
Размер:
423.42 Кб
Скачать

Особенности применения наследования

шаблонных классов

Например, есть несколько сходных классов, необходимо перекрыть одну (или несколько) виртуальную функцию.

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

Эту проблему можно решить двумя способами.

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

2.Использование шаблона.

Пример. Определение шаблона класса

class A { public:

virtual void print(){ printf("A::print()\n"); } void f(){printf("A::f()\n");}

};

class B

{

public:

virtual void print(){ printf("B::print()\n"); } void f(){printf("B::f()\n");}

};

class C

{

public:

virtual void print(){ printf(“C::print()\n"); } void f(){printf(“C::f()\n");}

};

template<class T> class D : public T { public:

virtual void print(){ printf("D::print()\n"); }

};

int main() { D<A> a1;

a1.print(); a1.f(); D<B> b1;

b1.print(); b1.f(); D<C> c1;

c1.print(); c1.f(); return 0;

}

Пример. Определение класса – потомка шаблонного класса

class A { public:

void calc(){}

};

template<class T> class B : public T { public:

void print(){}

};

class C : public B<A> { public:

void anyfunc(){}

};

int main()

{

C c; c.print(); c.anyfunc(); c.calc(); return 0;

}

Шаблоны и наследование связаны друг с другом следующим образом:

-шаблон класса может быть производным от шаблонного класса;

-шаблон класса может являться производным от нешаблонного класса;

-шаблонный класс может быть производным от шаблона класса;

-нешаблонный класса может быть производным от шаблона класса.

Шаблоны и друзья

Для шаблонов классов могут определены отношения дружественности.

Дружественность может быть установлена между шаблоном класса и глобальной функцией, функцией членом другого класса (возможно, шаблонного класса) или целым классом (возможно, шаблонным классом).

Синтаксическое оформление отношений дружественности в случае шаблонов классов достаточно сложно.

Шаблоны и статические члены

Каждый шаблонный класс, полученный из шаблона классов, имеет собственную копию каждого статического члена данных шаблона; все экземпляры этого шаблонного класса используют свой статический член данных.

Статические члены данных шаблонных классов должны быть инициализированы в области действия файла.

Каждый шаблонный класс получает собственную копию статической функции-члена шаблонного класса.

Пример. Статическое поле в шаблоне класса

template<class T> class A

{

public: static int a;

};

template<class T> int A<T>::a=10;

Соседние файлы в папке lectures