Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_-_zaochniki.doc
Скачиваний:
4
Добавлен:
20.11.2019
Размер:
427.01 Кб
Скачать

Вариант №7

Теоретический вопрос №1

Дать определение простому наследованию. Описать основные концепции данного подхода. Указать порядок вызовов конструкторов при простом наследования. Привести примеры.

Теоретический вопрос №2

Охарактеризовать абстрактный тип данных, чисто виртуальные функции. Привести примеры.

Практическое задание

Написать программу, в которой создаются и разрушаются объекты, определенного пользователем класса. Определить конструктор по умолчанию, конструктор с параметрами и копирующий конструктор. (Предметная область – Справочник).

Вариант №8

Теоретический вопрос №1

Дать определение понятию множественное наследование. Описать основные положения данного подхода. Указать порядок вызовов конструкторов в иерархии наследования. Привести примеры.

Теоретический вопрос №2

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

Практическое задание

Написать программу, в которой создаются и разрушаются объекты, определенного пользователем класса. Определить конструктор по умолчанию, конструктор с параметрами и копирующий конструктор. (Предметная область – Поликлиника).

Вариант №9

Теоретический вопрос №1

Дать определение конструктора и деструктора. Описать назначение конструктора и деструктора. Привести примеры.

Теоретический вопрос №2

Дать определение дружественных классов и функций. Привести примеры.

Практическое задание

Написать программу, в которой создаются и разрушаются объекты, определенного пользователем класса. Определить конструктор по умолчанию, конструктор с параметрами и копирующий конструктор. (Предметная область – Лесное хозяйство).

Вариант №10

Теоретический вопрос №1

Дать определение инкапсуляции. Описать модификаторы доступа. Привести примеры.

Теоретический вопрос №2

Дать определение виртуальной функции. Описать алгоритм реализации виртуального механизма. Привести примеры.

Практическое задание

Написать программу, в которой создаются и разрушаются объекты, определенного пользователем класса. Определить конструктор по умолчанию, конструктор с параметрами и копирующий конструктор. (Предметная область – Супермаркет).

Решение типового варианта

Вариант №11

Теоретический вопрос №1

Указать основные черты объектного подхода (5 основных характеристик).

Ответ:

Пять основных характеристик, которые представлены в чистых подходах к объектно-ориентированному программированию:

Все есть объект. Думать об объектах, как об особенных переменных; они хранят данные, но вы можете “сделать запрос” к такому объекту, попросив его самого выполнить операцию. Теоретически вы можете взять любой умозрительный компонент в проблеме, которую вы пробуете решить (собак, дома, услугу и т.п.) и представить его как объект в вашей программе.

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

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

Каждый объект имеет тип. Другими словами, каждый объект является экземпляром класса, где “класс” - это синоним “типа”. Большинство важных различий характеристик класса в том, “Какие сообщение можете вы посылать ему?”.

Все объекты определенного типа могут принимать одинаковые сообщения. Это действительно важное утверждение, как вы увидите позднее. Так как объект типа “круг” также является объектом типа “форма”, круг гарантированно примет сообщения формы. Это означает, что вы можете писать код, который говорит форме и автоматически управляет всем, что соответствует описанию формы. Это представляется одной из большинства полезных концепций ООП.

Теоретический вопрос №2

Понятие полиморфизма. Основные концепции. Создание полиморфного объекта. Примеры.

Ответ:

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

Основные концепции:

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

  • C++ упрощает создание полиморфных объектов.

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

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

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

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

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

class phone {

public:

void dial(char *number) {cout<<”Connecting...”<<endl;}//метод соединение

phone(char *number) { strcpy(phone::number, number); };

protected:

char number[13];

);

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

void main(void) {

phone telephone("555-1212");

telephone.dial("212-555-1212");

}

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

Поскольку нам известно наследование, то необходимо создать классы touch_tone(кнопочный) и pay_phone(платный) из класса phone, как показано ниже:

class touch_tone : phone {

public:

void dial(char * number){ cout<<"Connecting by touch_tone...”<<endl;}

touch_tone(char *number) : phone(number){ }

};

class pay_phone: phone {

public:

void dial(char *number) {

cout<<”Pay “<< amount <<” r”<<endl<<”Connecting... ”<< number <<endl;);

};

pay_phone(char *number, int amount) : phone(number) {

pay_phone::amount = amount;

}

private:

int amount;

};

Как видно, классы touch_tone и pay__phone определяют свой собственный метод dial. Если предположить, что метод dial класса, phone основан на дисковом телефоне, то не потребуется создавать класс для дискового телефона. Следующая программа использует эти классы для создания объектов rotary, touch_tone и pay_phone:

void main (void) {

phone rotary("303-555-1212");

rotary.dial("602-555-1212");

touch_tone telephone("555-1212");

telephone.dial("212-555-1212");

pay_phone city_phone("555-1111", 250);

city_phone.dial("212-555-1212");

}

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

Connecting...

Connecting by touch_tone...

Pay 250 r

Connecting... 212-555-1212

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

Практическое задание

Написать программу, в которой создаются и разрушаются объекты, определенного пользователем класса. Определить конструктор по умолчанию, конструктор с параметрами и копирующий конструктор. (Предметная область – Студент).

Решение:

Данная задача решается средствами Borland C++ Builder.

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

# include <iostream.h>

# include <assert.h>

# include <string.h>

# include <conio.h>

class Student { //объявление класса

public:

Student(); //объявление конструктора по умолчанию

Student (float, const char*, int);// объявление конструктора с параметрами

Student (const Student &);//объявление копирующего конструктора

~Student();//деструктор

//методы класса студент

void print();

void Changeball (float);

void Changename (char *);

void Changeyear (int);

//свойства класса

private:

float ball; //балл студента

char *name; // имя студента

int year; // год поступления

};

Student::Student() //конструктор по умолчанию, инициализирует объект

{

cout << "Constructor without arguments\n" ;

ball=6;

name = new char [6];

strcpy(name,"Vasya");

year = 2005;

}

Student::Student (float a, const char *str, int b) //конструктор с параметрами

//инициализирует объект путем передачи начальных значений через параметры

{

ball=a;

name = new char [strlen(str)+1];

strcpy (name,str);

year=b;

cout << "Constructor for " << name << " has been called\n";

}

Student::Student (const Student &c) //копирующий конструктор,

//инициализирует объект путем копирования свойств объекта этого же класса

{

ball = c.ball;

name = new char [strlen(c.name)+1];

strcpy (name,c.name);

year = c.year;

cout << "Copy constructor for " << name << " has been called\n" ;

}

Student::~Student ()//декструктор, уничтожает объект

{

cout << "Destructor for " << name << " has been called\n" ;

delete [] name;

}

void Student::print() //метод print, выводит информацию об объекте

{

cout << name <<"\n";

cout << "Ball: " << ball;

cout << " Year: " << year << "\n";

}

void Student::Changeball (float a) //метод Changeball, изменяет балл студента на //заданный

{

ball= a;

}

void Student::Changename (char *c) //метод Changename, изменяет имя студента на //заданное

{

name = new char [strlen(c)+1];

strcpy (name,c);

}

void Student::Changeyear (int b) //метод Changeyear, изменяет год поступления //студента на заданный

{ year = b;

}

int main()

{

//создаем 2 объекта с1 и с2 класса Student; c1 - используя конструктор по //умолчанию, с2 – конструктор с параметрами

Student c1, c2 (4.3,"Ivan",2003);

//создаем объект с3, используя копирующий конструктор

Student c3 (c2);

//создаем ссылки на созданные нами объекты

Student *c4 = &c1;

Student *c5 = &c2;

Student *c6 = &c3;

//выводим информацию об объектах

c1.print();

c2.print();

c3.print();

//изменяем балл, имя, год поступления студента с помощью соответствующих //методов

c4->Changeball(4.5);

c5->Changename("Kolay");

c6->Changeyear(2004);

return 0;

}