Добавил:
t.me Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 семестр / Вопросы к экзамену. Моё.docx
Скачиваний:
5
Добавлен:
16.07.2023
Размер:
58.39 Кб
Скачать

Int main(){

Derived *derived { new Derived(5) };

Base *base { derived };

delete base;

return 0;

}

21. Полиморфизм. Создание полиморфного объекта, пример.

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

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

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

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

Создание полиморфного объекта.

Для создания полиморфного объекта следует использовать указатель на объект базового класса. Каждый раз, когда программа присваивает указателю адрес объекта другого класса, объект этого указателя (который является полиморфным) изменяет форму.

#include <math.h>

#include <iostream>

using namespace std;

class baza {

int count;

public:

baza(int c) : count(c) {}

int rc() { return count; } // геттер count

virtual void func() { cout << "base class " <<rc()<<endl; }

};

class nasled1 : public baza {;

int count1;

public:

nasled1(int c, int c1) : count1(c1), baza(c) {}

void func() { cout << "perviy naslednik "<< rc() << count1 <<endl; }

};

class nasled2 : public baza {

int count2;

public:

nasled2(int c, int c2) : count2(c2), baza(c) {}

void func() { cout << "vtoroi naslednik " << rc() << count2 <<endl; }

}; int main(void) {

baza b(1);

nasled1 n1(2, 4);

nasled2 n2(6, 7);

baza* P; //полиморфный объект

P = &b;

P->func(); // base class 1

P = (baza*) & n1; // запись (baza*) - оператор приведения видов,

сообщает компилятору, что нужно присвоить адрес переменной(n1) одного

типа (nasled1) указателю на переменную другого типа (baza)

P->func(); // perviy naslednik 24

P = (baza*) &n2;

P->func(); // vtoroi naslednik 67

return 0;

}

(можно и не использовать явное приведение типов (baza*), они приводятся автоматически)

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

22. Стандартная библиотека шаблонов STL. Контейнеры, итераторы. Создание объектов контейнера.

STL – стандартная библиотека шаблонов, включённая в новые версии стандарта C++. STL обеспечивает стандартные классы и функции, которые реализуют наиболее популярные и широко используемые алгоритмы и структуры данных. STL строится на основе шаблонов классов, поэтому входящие в неё алгоритмы и структуры применимы почти ко всем типам данных.

Контейнер — это класс STL, реализующий функциональность некоторой структуры данных, то есть хранилища нескольких элементов. Примеры разных контейнеров: vector, stack, queue, deque, string, set, map и т.д.

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

массив: статический непрерывный массив (шаблон класса)

вектор: динамический непрерывный массив (шаблон класса)

deque: Двусторонняя очередь (шаблон класса)

forward_list: односвязный список (шаблон класса)

список: двусвязный список (шаблон класса)

Итератор — это такая структура данных, которая используется для обращения к определенному элементу в контейнерах STL. Обычно из используют с контейнерами set, list , а у вектора для этого применяют индексы.

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

Для создания итератора мы должны с самого начала программы подключить библиотеку <iterator>.

У каждого контейнера имеются два метода, которые, как указатели передают итератору начало или конец контейнера — begin() и end().

for (list<Student>::iterator iter = myList.begin(); iter != myList.end(); iter++) {

if((currentStudent -> phys == 5) && (currentStudent -> math == 5) && (currentStudent -> infa == 5)) {

iter -> stip = iter -> stip * 1.5;

countStudent++;

}

}

23. Стандартная библиотека шаблонов. Последовательные контейнеры. Примеры vector и list.

STL – стандартная библиотека шаблонов, включённая в новые версии стандарта C++. STL обеспечивает стандартные классы и функции, которые реализуют наиболее популярные и широко используемые алгоритмы и структуры данных. STL строится на основе шаблонов классов, поэтому входящие в неё алгоритмы и структуры применимы почти ко всем типам данных.

Стандартная библиотека C++ содержит контейнеры двух типов: последовательные и ассоциативные.

Последовательные контейнеры обеспечивают эффективный последовательный доступ к элементам. Примерами последовательных структур данных являются двусвязный список и массив, которые в C++ представлены типами list и vector, соответственно.

Пример нахождения суммы элементов вектора:

#include <math.h>

#include <iostream>

#include <vector>

using namespace std;

int main(void) {

int n, x, sum=0;

vector <int> A;

vector <int>::iterator it;

cin >> n;

for (int i = 0;i < n;i++) {

cin >> x;

A.push_back(x);

}

for (it = A.begin();it != A.end();it++) {

sum = sum + (*it);

}

cout << "sum=" << sum;

return 0;

}

Пример нахождения суммы элементов списка:

#include <list>