Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Catch( тип1 аргумент )




Try

Else

T x;

O1.show()

O1.init(1,2,3);

Сlass Base

Доступ3 имя_base3,

Доступ2 имя_base2,

{

//...

};

Наследование каждого базового класса имеет свой вид доступа.

2.03

Если базовые и производные классы содержал конструкторы и деструкторы, то:

· При создании экземпляра производного класса сначала вызываются все конструкторы базовых классов (в порядке, который указан в списке наследование), и только затем конструктор производного класса;

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

· При иерархическом наследование - конструкторы вызываются в иерархическом порядке, деструкторы-наоборот.

Расширенная форма конструктора производного класса:

Derived (аргументы): Base1(аргументы), Base2(аргументы),... BaseN(аргументы)

{

//...

};

Особенности:

· Список аргументов производного класса обычно должен содержать все параметры, необходимые базовым классам

· Передача аргументов конструктора базовых классов не включает их использования в конструкторе производного класса.

 

 

2.04

При множественном наследовании наблюдаются ситуации, когда в некотором объекте содержатся две или более копии некоторого базового класса. При этом необходимо устранять неоднозначное обращение к членам этого базового класса из-за дублирования этих членов:

· Применение оператора разрешения зоны видимости - не устраняет дубликатов, а только разрешает саму неоднозначность при компиляции

· Применение виртуальных базовых классов - в каждый объект производного класса (а также и его наследников) копируется только одна копия виртуального базового класса независимо от числа наследования от этого базового класса(если базовый класс имеет больше одного наследника, то его обычно объявляют виртуальным)

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

{

public:

int a;

};

class Derived1: virtual public Base

{

public:

int b;

};

class Derived2: virtual public Base

{

public:

int c;

};

class Derived3: private Derived1, private Derived2

{

//...

void init (int aa,bb,int cc){

a = aa;

Derived1::a = aa;

b = bb;

c = cc;

}

void show()

{

std::cout << a;

std::cout << ’a=’ << derived1::a;

std::cout << derived2::a;

std::cout << b;

std::cout << c;

}

};

int main()

{

Derived3 o1;

return 0;

}

===============================================

 

2.05

Указатели на объекты базового типа могут ссылаться и на объекты производного типа от этого базового типа. При этом можно получить доступ только к наследуемым (базовым) членам класса.

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

Особенности:

· если указатель на базовый класс привести к типу указателя на производный класс, то откроется доступ ко всем членам производного класса

· если указатель на базовый класс используется для доступа к производному объекту, то увеличеие указателя на еденицу не даст доступ к следующему объекту ПРОИЗВОДНОГО типа

Ссылки на производные типы:

· ссылка на бызовый класс может использоваться для доступа к объектам производного класса

· пааметру, передаваемому с помощью ссыли на базовый класс, можн оприсваивать как объекты базового, так и производного типов

 

2.06

Виртуальная функция объявляется с модификатором virtual в базовом классе и переопределяется \ не переопределяется в производном классе.

Особенности:

1) Реализует принцип «один интерфейс, несколько методов» (динамический полиморфизм)

2) Виртуальная функция в базовом классе определяет вид интерфейса (способ вызова функции)

3) Переопределение функции в производном классе создает конкретный метод (реализация операции присущей только этому классу)

4) Функция производного класса не перегружает, а замещает виртуальную-один интерфейс (одинаковое описание)

5) Виртуальные функции не могут быть статическими членами класса

6) Виртуальные функции не могут быть дружественными функциями

7) Конструкторы не могут быть виртуальными

8) Деструктор может быть виртуальным

9) При обычном вызове виртуальные функции ничем не отличается от остальных функций-членов класса

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

Наследование виртуальных функций.

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

Сколько бы раз не наследовалась виртуальная функция, она всё равно остается виртуальной и не требует указания virtual при переопределении (если указать -не ошибка).

Если виртуальная функция базового класса НЕ замещается в производном классе, то вызывается её предыдущая переопределённая версия.

 

2.07

Чисто виртуальная функция (pure virtual function) - виртуальная функция заданная в базовом классе как:

virtual тип имя_функции(параметры) = 0;

Особенности:

1) Для базового класса может отсутствовать алгоритм виртуальной функции - чтобы её не вызывал производный класс её лучше задать чисто виртуальной;

2) Если виртуальная функция обязательно должна переопределяться в каждом производном классе, то её следует задать чисто виртуальной.

Абстрактный класс.

Абстрактный класс - класс, содержащий одну или несколько чисто виртуальных функций.

Особенности:

1) Экземпляр абстрактного класса создать нельзя -> только основа для производных классов.

2) При поддержки динамического полиморфизма можно создавать указатели и ссылки на абстрактный класс;

3) На основе абстрактного класса можно создавать библиотеки классов.

 

2.08

Раннее связывание - выбор вызываемой функции осуществляется на этапе компиляции (например, выбор перегруженной функции или оператора).

Особенности:

· Эффективность (быстрый вызов функций);

· Большой объём кода (вызовы сформированы при компиляции программы).

Позднее связывание

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

Особенности:

· Гибкий код

· Замедление работы программы

Связь понятия с принципами ООП ->

- статический полиморфизм, или полиморфизм времени компиляции (compile-time polymorphism), осуществляется за счет перегрузки и шаблонов функций;

- динамический полиморфизм, или полиморфизм времени выполнения (run-time polymorphism), реализуется виртуальными функциями.

 

2.09

Шаблоны.

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

Особенности:

· работаютс типом данных, заданных как параметр

· одну и ту же функцию или класс можно применять к разным типам данных (без использования отжельных вариантов реализации для каждого типа) - облегчение написания кода

· образуют дополнительный уровень абстракции

Шаблонные функции

Шаблонная (обобщенная) функция определяет одинаковый набор операций, применимый к различным типам данных.

Конкретная версия шаблонной функции, созданной компилятором, - специализация (генерируемая функция).

Конструкция шаблонной функции.

template < class Type > возвращаемый_тип имя_функции (параметры)

{

//....

}

Особенности:

· объявляется с помощью ключевого слова template

· Type - тип данных с которым работает функция

· для задания типа данных используется ключевое слово class или typename

2.10

Шаблонная функция с несколькими параметрами.

template < class T1, class T2,..., class TN > возвращаемый_тип имя_функции (параметры)

{

//...

}

Осбоненности:

· Т1, Т2... ТN - типы данных, с которыми работает функция

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

2.11

Можно создать отдельную конкретную версию шаблонной функции для конкретного типа параметров.

Особенности:

· позволяет перегрузить шаблонную функцию для конкретных типов параметров

· если версий функции много, то лучше использовать чистую перегрузку, а не шаблоны

 

2.12

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

 

2.13

Шаблонный класс (или обобщенный) определяет класс, в котором фактический тип данных для алгоритмов задается в качсестве параметра при создании экземпляра класса.

Шаблонные классы лучше всего создавать, если логика работы класса не зависит от типа данных (массивы, очереди...).

Конструкция шаблонного класса.

template < class Т >

class имя_ класса

{

//...

};

Создание объекта класса:

имя_класса < тип_данных> имя_объекта;

Особенности:

· объявляется с помощью ключевого слова template

· для задания типа данных используется ключевое слово class или typename

· Т - тип данных, который уточняется при создании экземпляра класса

· функции-члены шаблонного класса автоматически становятся шаблонными

 

2.14

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

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

Особенности:

· в качсестве стандартных параметров можно применять только целые числа, указатели и ссылки

· аргументы, которые передаются стандартными параметрами, можно рассматривать как константы

· значения стандартных аргументов должны быть известны на этапе компиляции

2.15

В списке < class T1, class T2... > при задании шаблонного класса можно использовать значения по умолчанию.

Особенности:

· для типов данных задаются известные типы данных

· для стандартных аргументов также можно использовать значения по умолчанию

· значения по умолчанию используються при создании экземпляра объекта, если не заданы явные значения аргументов

· повышается универсальность шаблонных классво (причина необходимости *)

template < class T = int, int size = 10>

class Car {... };

2.16

Разрешается создавать явные специализиции шаблонных классов.

Особенности:

· для создания явно указывается тип:

template < > class имя_класса <явный_тип> {... };

· специализация расширяет возвожности шаблонных классов, т.к. позволяет обрабатывать отдельные особые ситуации

· если требуется создание большого количества специализаций, то необходимо отказаться от шаблонного класса

// Шаблонный класс

template <class T> class cobject

{

public:

cobject(T a) {cout<<”template class<<endl; x=a; }

T getx() {return x;}

};

// Явная специализация шаблонного класса для типа int

template <> class cobject<int>

{

int x;

public:

cobject(int a) {

cout << ”int specialization<<endl;

if(a>0) x=a;

if(a<0) x=-a;

}

int getx() {return x;}

};

 

 

2.17

Исключительные ситуации.

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

Особенности:

· автоматический вызов процедур обработки ошибок

· польза при выходе из глубоко вложенных функций при возникновении ощибок

· упрощает процесс создания программ

{

// контролируемый код

}

{

// код обработки

}




Поделиться с друзьями:


Дата добавления: 2015-03-29; Просмотров: 284; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.087 сек.