Курс ООП в С презентация. ООП в с++(полный курс). Объекты и классы
Скачать 1.76 Mb.
|
Виртуальные методыЧтобы избежать двойного наследования полей, при наследовании общего предка, его определяют с ключевым словом virtual (виртуальный класс). class person {...}; class student: virtual person {...}; class employee: virtual person {...}; class employee_student: public employee, public student {...}; Класс employee_student будет содержать только один экземпляр полей класса person. Шаблоны классов Шаблоны классовШаблоны функций Шаблоны вводятся для того, чтобы автоматизировать создание функций, обрабатывающих разнотипные данные (см. часть I). При перегрузке функции для каждого используемого типа определяется своя функция. Шаблон функции определяется один раз, но определение параметризируется, т. е. тип данных передается как параметр шаблона. Формат шаблона: template <параметры_шаблона> заголовок_функции {тело функции} Таким образом, шаблон семейства функций состоит из 2 частей – заголовка шаблона: template <список параметров шаблона> и обыкновенного определения функции, в котором вместо типа возвращаемого значения и/или типа параметров, записывается имя типа, определенное в заголовке шаблона. Шаблоны классовtemplate { cout << "Enter value: " << endl; cin >> value; } Подобные функции часто имеет смысл группировать в параметризованные утилиты классов, имеющие практически то же предназначение, что и обычные утилиты классов: Естественно, в некоторых случаях необходимо учитывать и особенности типов, указываемых в качестве параметров шаблона. Так, операции ввода и вывода потоковых классов определены по умолчанию только для простых типов. Соответственно, если мы желаем использовать такие операции для определяемых нами классов, то их требуется переопределить для работы с объектами этих классов. Шаблоны классовtemplate { public: static void set_value(T&); static void show_value(T&); }; template { cout << "Enter value: " << endl; cin >> value; }; template { cout << "Value is: " << value << endl; }; Cледует отметить, что объявление класса шаблона и реализация его функций должны размещаться в одной единице трансляции, под которой обычно подразумевается заголовочный файл, например "util.h". Обращение к таким функциям будут иметь свои особенности, поскольку потребуется указывать тип – параметр шаблона: Шаблоны классовШаблоны классов Шаблоны классов так же, как и шаблоны функций поддерживают механизм обобщенного программирования, т. е. программирования с использованием типов в качестве параметров. Механизм шаблонов в C++ допускает применение абстрактного типа в качестве параметра при определении класса. Такой класс называется параметризованным. После того как шаблон класса определен, он может использоваться для определения конкретных классов. Процесс генерации компилятором определения конкретного класса по шаблону класса и аргументам шаблона называется инстанцированием шаблона. Определение параметризованного (шаблонного, обобщенного) класса имеет вид: template <параметры шаблона> class имя_класса { ... }; Шаблоны классовВ качестве примера для шаблона продолжим рассмотрение нашего класса-группы для объектов, поскольку самым распространенным способом использования шаблонов классов является реализация различных видов контейнеров. Ниже рассмотрен шаблон класса group, предназначенного для определения контейнерных типов с элементами любых типов (как стандартных, так и определённых программистом). template //Т – параметр шаблона { public: group(); void push_back(T); void for_each(void (*)(T&)); protected: node node }; Шаблоны классовНаш объект-группа представляет собой заготовку двунаправленного списка, реализуемого посредством включения указателей на первый и последний элемент типа node. Каждый из них реализуется шаблоном структуры, включающим в себя помимо указателей на соседние элементы (prev и next) и атрибут data хранимого элементом значения типа T. template { public: node T data; node }; |