Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Плещёв ВУМИП 2012-07-06.doc
Скачиваний:
66
Добавлен:
13.05.2015
Размер:
9.35 Mб
Скачать

6.6.2. Виртуальные методы

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

Пример виртульного метода и позднего его связывания:

class Parent // объявление родительского класса Parent

{ public: // общедоступные методы и переменные класса Parent

virtual double Fun1(double x) {return x*x;} // виртуальный метод Fun1

double Fun2(double x) {return Fun1(x)/4;} // обычный метод Fun2

}; // окончание объявления класса Parent

class Child: public Parent// объявление потомка Parent из класса Child

{public: // общедоступные методы и переменные класса Child

virtual double Fun1(double x) {return x*x*x;} // виртуальный метод Fun1

}; // окончание объявления класса Child

int main(int argc, char **argv) // основная процедура тестирования классов

{ Child child;// создания объектаchildклассаChild

// Вывод значения функции, наследуемой из родительского класса Parent

// Fun2(4), которая в свою очередь вызовет переопределенную виртуаль­//ную функцию Fun1 потомка Child (Child::Fun1), а не родительскую //функцию Fun1 (Parent::Fun1).

cout << child.Fun2(4) << endl; // вывод значения 16

getch(); return 0; // задержка и завершение работы функции тестирования

} // конец функции тестирования

6.6.3. Дружественные функции

Дружественные фукции имеют доступ ко всем защищенным и при­ват­ным членам данных внешних классов. Объявление их имеет вид:

Friend returnType <имя функции>(<параметры>). Оператор вызова функ­ции имеет вид: <имя функции>(&<имя экземпляра класса с функцией>).

6.6.4. Шаблоны

Шаблоны позволяют создавать семейство функций или классов:

Template < список шаблонных типов> { <объявление>};

Шаблон функций задает образец объявлений перегруженных фун­кций (типы аргу­ментов и результатов работы функции могут меняться при ее различных вызовах) (п.6.2.7). Фактичес­кие типы должны быть известны во время компиляции.

Пример шаблона функции maxim (нахождение наиболь­ше­го числа из двух чисел, все аргументы и результат имеют пе­ре­менный тип T):

template <class T> T maxim (T x,T y) // шаблон функции maxim

{ return (x > y) ? x : y;} // тело функции maxim

int main(int argc, char **argv) // основная функция проверки шаблона

{ int i=2; int j=maxim(i,0); // аргументы функции maxim типа int

float a=3.2,b=8.6;float m=maxim(a,b);//аргументы функции maxim типа float

cout << j << endl; cout << m <<endl; getch(); return 0; // вывод результатов

} // конец функции

Шаблон классов задает образец определений семейства классов.

Пример шаблона Vector ‑ генератор классов одномерных массивов.

template <class T> class Vector;

6.6.5. Пространство имен

Механизм пространства внешних (глобальных) имен позволяет раз­бить приложе­ние на отдельные пространства, в каждом из которых можно определить свои глобальные иден­тификато­ры. Последние не зависят от других прост­ранств. Каждое пространство начинается со строки:

namespace <идентификатор подсистемы> { [<объявления>]}.

Существуют три способа доступа к элементам подсистем:

  1. Явная в виде <имя подсистемы>::<переменная, функция> (first::nds).

  2. Доступ ко всем элементам в виде using namespace::<имя подсистемы> (using namespace:: first).

  3. Объявление нового идентификатора в локальном пространстве имен в ви­де: using :: <новое имя> (using :: nds;).

Пример:

namespace first { int i=10, j=11; } // объявление пространства first

int main(int argc, char **argv) // основная функция тестирования

{ cout << first::i << endl; // вывод переменной i=10 из пространства first

using namespace :: first; // доступ ко всем переменным пространства first

cout << j << endl; // вывод переменной j=11 из пространства first

getch(); return 0; // задержка и выход из функции

} // конец тела основной функции