Механизм работы виртуальных функций

      Комментарии к записи Механизм работы виртуальных функций отключены

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

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

Вызов виртуальной функции происходит через vtable, на которую указывает vptr объекта, делающего вызов. Адрес вызываемой функции определяется не во время трансляции (это было бы раннее связывание), а во время выполнения программы (позднее связывание). Это и позволяет из функции set_year ( ), унаследованной от базового класса, обратиться к функции print( ), определенной в производном классе.

Полиморфизм

На объект класса Birthday может указывать как переменная типа Birthday*, так и переменная типа Date*. Независимо от типа указателя виртуальные методы будут вызываться в соответствии с истинным классом объекта.

Пример.

?

Date *pd;

pd = new date(10, 10, 2000);

pd-print(); // Выводится объект класса date

delete pd;

pd = new birthday(10, 10, 2000, “Peter”);

pd-print(); // Выводится объект класса birthday

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

Замечание.Пример другого полиморфизма в С++ дает перегрузка функций.

Множественное наследование

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

class AB: public A, public B {…};

Класс AB наследует все компоненты классов A и B. Если компоненты базовых классов имеют одинаковые имена, неоднозначность устраняется операцией разрешения видимости:

A::имя или B::имя.

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

Возможен случай, когда оба класса A и B имеют в числе предков класс R (рисунок а).

R R R

| | / \

A B A B

\ / \ /

AB AB

а) б)

В этом случае класс AB косвенно наследует два разных экземпляра класса R и при обращении к компонентам R из функций AB потребуется уточнить, какой R имеется в виду:

A::имя или B::имя.

Чтобы класс AB наследовал не два, а один экземпляр класса R, его надо объявить виртуальным при определении классов A и B.

?

class A: virtual public R {…

class B: virtual public R {…

Тогда возникнет ситуация, изображенная на рис.1-б, уточнение не понадобится и к тому же сэкономятся ресурсы.

Пример. Множественное наследование с общим предком.

?

classC0 { public: voidf() { cout

Списки инициализации

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

Пример. Конструктор со списком инициализации.

?

// Базовый класс

class Complex {

public:

Complex( float re, float im )

{real = re; imag = im;};

}

// Производный класс

class Triplex : public Complex {

public:

Triplex(float re, float im, int co):

Complex(re, im) { color = co;};

}

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

?

Triplex(float re, float im, int co):Complex(re, im), color(co) {};

Список инициализации является единственным средством инициализации элементов-констант, элементов-ссылок и элементов-объектов, конструкторы которых имеют параметры.

Примеры наследования

#include

using namespace std;

class base {

int i, j ;

public:

void set(int a, int b) { i=a; j=b; }

void show() { cout

};

class derived : public base {

int k;

public:

derived(int x) { k=x; }

void showk() { cout

};

int main()

{

derived ob(3);

ob.set(1, 2); // Обращение к члену класса base

ob.show(); // Обращение к члену класса base вывод 1 2

ob.showk(); // Обращение к члену класса derived вывод 3

cin.get();

return 0;

}

//////////

#include

using namespace std;

class base {

int i, j ;

public:

void set(int a, int b) { i=a; j=b; }

void show() { cout

int y;

};

class derived : private base {

int k;

public:

derived(int x) { k=x; }

void showk() { cout

base::show;//открываем доступ

};

int main()

{

derived ob(3);

// ob.set(1, 2); // Обращение к члену класса base

ob.show(); // Обращение к члену класса base вывод 1 2

ob.showk(); // Обращение к члену класса derived вывлд 3

cin.get();

return 0;

}

#include

using namespace std;

class base {

int i;

public:

base() { cout

~base() { cout

};

class derived : public base {

public:

derived() { cout

~derived() { cout

};

int main()

{

{

derived ob;

derived *pob;

pob=new derived;

delete pob;

}

cin.get();

return 0;

}

//////////////////////////

#include

using namespace std;

class base1 {

public:

base1() { cout

~base1() { cout

};

class base2 {

public:

base2() { cout

~base2() { cout

};

class derived : public base1, public base2{

public:

derived() { cout

~derived() { cout

};

int main()

{

{

derived ob;

}

cin.get();

return 0;

}

Результат:

create base1

create base2

create derived

delete derived

delete base2

delete base1

///////////////////

#include

using namespace std;

class base {

int i ;

public:

base(){i=5; cout

~base(){cout

};

class derived : private base {

int k;

public:

derived(){k=6; cout

~derived(){cout

};

int main()

{

{

derived ob;

}

cin.get();

return 0;

}

Результат:

create 5 base

create 6 derived

delete 6 derived

delete 5 base

#include

using namespace std;

class base {

int i ;

public:

base(int x){i=x; cout

~base(){cout

};

class derived : private base {

int k;

public:

derived(int x):base(x)

{k=x; cout

~derived(){cout

};

int main()

{

{

derived ob(1);

derived *pob;

pob=new derived(2);

}

cin.get();

return 0;

}

Результат:

create 1 base

create 1 derived

create 2 base

create 2 derived

delete 1 derived

delete 1 base

#include

using namespace std;

class base1 {

int i ;

public:

base1(int x){i=x; cout

~base1(){cout

};

class base2 {

int i ;

public:

base2(int x){i=x; cout

~base2(){cout

};

class derived : public base1,public base2 {

int k;

public:

derived(int x, int y):base1(x),base2(y)

{k=x+y; cout

~derived(){cout

};

int main()

{

{

derived ob(1,2);

derived *pob;

pob=new derived(3,4);

delete pob;

}

cin.get();

return 0;

}

Результат

create 1 base1

create 2 base2

create 3 derived

create 3 base1

create 4 base2

create 7 derived

delete 7 derived

delete 4 base2

delete 3 base1

delete 3 derived

delete 2 base2

delete 1 base1

Второй пример главной функции:

int main()

{

{

base1 *pob;

pob=new derived(3,4);

delete pob;

}

cin.get();

return 0;

}

Результат:

create 3 base1

create 4 base2

create 7 derived

delete 3 base1

Третий пример главной функции:

int main()

{

{

base1 *pob;

pob=new derived(3,4);

delete (derived*)pob;

}

cin.get();

return 0;

}

create 3 base1

create 4 base2

create 7 derived

delete 7 derived

delete 4 base2

delete 3 base1

/////////////Пример разницы виртуального метода и не виртуального

#include

using namespace std;

class base{

int i ;

public:

base(int x){i=x; cout

~base(){cout

void showdata(){cout

};

class derived : public base{

int k;

public:

derived(int x):base(x)

{k=x+x; cout

~derived(){cout

void showdata(){cout

};

int main()

{

{

base *pob;

pob=new derived(3);

pob-showdata();

delete (base*)pob;

}

cin.get();

return 0;

}

Результат:

create 3 base

create 6 derived

3 base //т.е. вызвался метод по топу указателя – т.е. раннее связывание

delete 3 base

/////////////Пример тотже только с изменением витуальности функции

#include

using namespace std;

class base{

int i ;

public:

base(int x){i=x; cout

virtual~base(){cout

virtual void showdata(){cout

};

class derived : public base{

int k;

public:

derived(int x):base(x)

{k=x+x; cout

virtual~derived(){cout

void showdata(){cout

};

int main()

{

{

base *pob;

pob=new derived(3);

pob-showdata();

delete pob;

}

cin.get();

return 0;

}

Результат:

Порядок виконання роботи

6.4 Контрольні запитання та завдання

Завдання

Создать базовый абстрактный класс и породить от него соответствующий класс наследник.

6.6 Варіанти завдань

Вариант 1

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем STUDENT, содержащая следующие поля:

— фамилия и инициалы; — номер группы; — успеваемость (массив из пяти элементов).

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT;

— вывод на дисплей фамилий и номеров групп для всех студентов, включенных в массив, если средний балл студента больше 4.0;

Вариант 2

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем STUDENT, содержащая следующие поля;

— фамилия и инициалы; — номер группы; — успеваемость (массив из пяти элементов).

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT;

— вывод на дисплей фамилий и номеров групп для всех студентов, имеющих оценки 4 и 5, если таких студентов нет, вывести соответствующее сообщение.

Вариант 3

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем STUDENT, содержащая следующие поля:

— фамилия и инициалы; — номер группы; — успеваемость (массив из пяти элементов).

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по алфавиту;

— вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку 2, если таких студентов нет, вывести соответствующее сообщение.

Вариант 4

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем AEROFLOT, содержащую следующие поля:

— название пункта назначения рейса; — номер рейса; — тип самолета.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из семи элементов типа AEROFLOT;

— вывод на экран номеров рейсов и типов самолетов, вылетающих в пункт назначения, название которого совпало с названием, введенным с клавиатуры;

Вариант 5

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем AEROFLOT, содержащую следующие поля:

— название пункта назначения рейса;- номер рейса; — тип самолета.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из семи элементов типа AEROFLOT;

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

— если таких рейсов нет, выдать на дисплей соответствующее сообщение.

Вариант 6

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем WORKER, содержащую следующие поля:

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

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из десяти структур типа WORKER; — вывод на дисплей фамилий работников, чей стаж работы в организации превышает значение, введенное с клавиатуры.

Вариант 7

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем TRAIN, содержащую следующие поля:

— название пункта назначения; — номер поезда; — время отправления.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN;

— вывод на экран информации о поездах, отправляющихся после введенного с клавиатуры времени.

Вариант 8

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем TRAIN, содержащую следующие поля:

— название пункта назначения; — номер поезда;- время отправления.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из шести элементов типа TRAIN;

— вывод на экран информации о поездах, направляющихся в пункт, название которого введено с клавиатуры.

Вариант 9

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем TRAIN, содержащую следующие поля:

— название пункта назначения; — номер поезда; — время отправления.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

— вывод на экран информации о поездах по указанному номеру (номер передается в метод виде параметра).

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN;

— вывод на экран информации о поезде, номер которого введен с клавиатуры.

Вариант 10

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем MARSH, содержащую следующие поля:

— название начального пункта маршрута; — название конечного пункта маршрута; — номер маршрута.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

— вывод на экран информации о маршруте по указанному номеру (номер передается в метод виде параметра) , если таких нет, выдать на дисплей соответствующее сообщение..

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа MARSH; — вывод на экран информации о маршруте, номер которого введен с клавиатуры;

Вариант 11

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем MARSH, содержащую следующие поля:

— название начального пункта маршрута; — название конечного пункта маршрута; — номер маршрута.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа MARSH;- вывод на экран информации о маршрутах, которые начинаются или оканчиваются в пункте, название которого введено с клавиатуры;

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

Вариант 12

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем NOTE, содержащую следующие поля:

— фамилия, имя; — номер телефона; — дата рождения (массив из трех чисел).

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

— вывод на экран информации о маршрутах, которые начинаются или оканчиваются в пункте (название пункта передается в метод виде параметра).

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE;

— вывод на экран информации о человеке, номер телефона которого введен с клавиатуры.

Вариант 13

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем NOTE, содержащую следующие поля:

— фамилия, имя; — номер телефона; — дата рождения (массив из трех чисел).

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE;

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

Вариант 14

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем NOTE, содержащую следующие поля:

— фамилия, имя; — номер телефона; — дата рождения (массив из трех чисел).

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE;

— вывод на экран информации о человеке, чья фамилия введена с клавиатуры.

Вариант 15

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем ZNAK, содержащую следующие поля:

— фамилия, имя; — знак Зодиака; — дата рождения (массив из трех чисел).

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK;

— вывод на экран информации о человеке, чья фамилия введена с клавиатуры.

Вариант 16

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем ZNAK, содержащую следующие поля:

— фамилия, имя; — знак Зодиака; — дата рождения (массив из трех чисел).

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

— вывод на экран информации о людях, родившихся под знаком (название знака передается в метод виде параметра), если таких нет, выдать на дисплей соответствующее сообщение.

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK;

— вывод на экран информации о людях, родившихся под знаком, название которого введено с клавиатуры!.

Вариант 17

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем ZNAK, содержащую следующие поля: — фамилия, имя; — знак Зодиака; — дата рождения (массив из трех чисел).

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

— вывод на экран информации о людях, родившихся в месяц (название месяца передается в метод виде параметра), если таких нет, выдать на дисплей соответствующее сообщение.

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK;

— вывод на экран информации о людях, родившихся в месяц, значение которого введено с клавиатуры.

Вариант 18

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем PRICE, содержащую следующие поля:

— название товара;- название магазина, в котором продается товар; — стоимость товара в руб.

Переопределить функции ввода и вывода. Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE;

— вывод на экран информации о товаре, название которого введено с клавиатуры.

Вариант 19

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем PRICE, содержащую следующие поля:

— название товара; — название магазина, в котором продается товар; — стоимость товара в руб.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE;

— вывод на экран информации о товарах, продающихся в магазине, название которого введено с клавиатуры.

Вариант 20

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем ORDER, содержащую следующие поля:

— расчетный счет плательщика; — расчетный счет получателя; — перечисляемая сумма в руб.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ORDER;

— вывод на экран информации о сумме, снятой с расчетного счета плательщика, введенного с клавиатуры;

Вариант 21

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем STUDENT, содержащую следующие поля; — фамилия и инициалы;

— номер группы; — успеваемость (массив из пяти элементов).

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

— вывод на дисплей фамилий и номеров групп для всех студентов, у которых успеваемость выше среднего.

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; — вывод на дисплей фамилий и номеров групп для всех студентов, у которых успеваемость выше среднего;

Вариант 22

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем STUDENT, содержащую следующие поля; — фамилия и инициалы;

— номер группы; — успеваемость (массив из пяти элементов).

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT;

— вывод на дисплей фамилий и номеров групп для всех студентов, у которых успеваемость выше 2.0 бала и ниже 4.5.

Вариант 23

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем PRICE, содержащую следующие поля:

— название товара; — название магазина, в котором продается товар; — стоимость товара в руб.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE;

— вывод на экран перечень магазинов, в которых есть в наличии товаре, название которого введено с клавиатуры.

Вариант 24

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем PRICE, содержащую следующие поля:

— название товара; — название магазина, в котором продается товар; — стоимость товара в руб.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE;

— вывод на список товаров, в которые есть в наличии в указанном магазине, название которого введено с клавиатуры.

Вариант 25

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем COMP, содержащую следующие поля:

— название компьютера; — рейтинговая частота процессора; — количество ОЗУ.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

— вывод на экран список компьютеров у которых мощность процессора выше среднего.

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа COMP;

— вывод на экран список компьютеров у которых мощность процессора выше среднего;

Вариант 26

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем COMP, содержащую следующие поля:

— название компьютера; — рейтинговая частота процессора; — количество ОЗУ.

Переопределить функции ввода и вывода.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа COMP;

— вывод на экран список компьютеров у которых количество памяти больше 64Мб и меньше 1024Мб.

Вариант 27

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

Создать класс наследник, в котором указано, что массив является массивом структур с именем COMP, содержащую следующие поля:

— название компьютера; — рейтинговая частота процессора; — количество ОЗУ.

Реализовать в виде методов следующие действия:

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

Написать программу, выполняющую следующие действия:

— ввод с клавиатуры данных в массив, состоящий из восьми элементов типа COMP;

— вывод на экран список компьютеров у которых количество памяти больше 128Мб и частота процессора больше 1000Гц.

Контрольний приклад

//Пример базового шаблонного класса с виртуальными методами

//и порожденного наследника с определением шаблона

#include

#include

using namespace std;

struct TStud

{

string Name;

int Bal;

};

template

class TMen

{

protected:

T *mas;

int n;

public:

TMen()

{n=2;mas=new T[n];}

TMen(int k)

{n=k;mas=new T[n];}

TMen(const TMen Men)

{

if (this==Men) return ;

this-n=Men.n;

mas=new T[n];

for(int i=0;i

mas[i]=Men.mas[i];

}

virtual ~TMen()

{ delete []mas; }

virtual void input()=0;

virtual void output()=0;

};

class Stud :public TMen

{

public:

Stud():TMen(){;};

Stud(int k):TMen(k){;};

Stud(const Stud St):TMen(St){;};

virtual void input()

{

cout

for(int i=0;i

{

cout

cinmas[i].Name;

cout

cinmas[i].Bal;

}

};

virtual void output()

{

for(int i=0;i

cout

};

};//class Stud

int main(int argc, char* argv[])

{

Stud st1(3);

st1.input();

Stud st2(st1);

st2.output();

cin.get();

cin.get();

return 0;

}

//—————————————————————————

РЕКОМЕНДОВАНА ЛІТЕРАТУРА

1.Павловская Т.А. С/С++. Программирование на языке высокого уровня — СПБ Питер.: 2004., — 461 с.

2.Франка П. C++: учебный курс. — СПб.: Питер, 2003. — 521 с.

3.Сабуров С.В. Языки программирования C и C++. М.: Букпресс, 2006. 647 с.

4.Керниган Б., Ритчи Д. Язык программирования Си: Пер. с англ. — М.: Финансы и статистика, 1992. — 272 с.

5.Страуструп Б. Язык программирования С++. Часть 1. — Киев: ДиаСофт, 1993. — 264 с.

6.Страуструп Б. Язык программирования С++. Часть 2. — Киев: ДиаСофт, 1993. — 296 с.

7.Подбельский В.В. Язык Си+: Учеб. пособие. — М.: БИНОМ, 1995. — 400 с.

8.Глушаков С.В. и др. Язык программирования С++. —Харьков: Фолио, 2002. — 500 с.

9.Х.М.Дейтел, П.Дж. Дейтел Как программировать на С++.- М.:ЗАО «Издательство БИНОМ», 2000г. — 1024 с.

10.Ван Тассел Д. Стиль, разработка, отладка и испытание программ.-M.:Мир,1985.

11.Проценко В.С. Техніка програмування мовою С. —Навч. Посібник. –К.:Либідь, 1993. — 224с.

12.Жешке Р. Толковый словарь стандарта языка Си: — С.-Петербург: Питер, 1994. — 221с.

13.Язык Си. Книга ответов: Пер. с англ. — М.: Финансы и статистика, 1994. — 160 с.

Навчальне видання

МЕТОДИЧНІ ВКАЗІВКИ

до лабораторних та практичних робіт з дисципліни

“Програмування”

для студентів денної форми навчання спеціальності

_____________

.

Упорядники: ЛЮБЧЕНКО Валентин Анатолійович

ЯКОВЛЕВА Олена Володимирівна

РУДЕНКО Діана Олександрівна

Відповідальний випусковий Є.П.Путятін

Редактор В.І.Заславська

Комп’ютерна верстка Л.Ю.Свєтайло

План 2006, поз. 29

Підп. до друку 8.07.06. Формат 60х84 1/16. Спосіб друку-ризографія

Умов. друк. арк. 2,6. Облік вид. арк.2,3. Тираж 75 прим.

Зам.№ 1-122. Ціна договірна.

ХНУРЕ. 61166 Харків, просп. Леніна, 14.

Віддруковано в навчально-науковому

видавничо-поліграфічному центрі ХНУРЕ

61166 Харків, просп. Леніна, 14.

Статьи к прочтению:

Основы ООП C++. Урок 11 — Виртуальные функции


Похожие статьи: