[МГТУ - 2 курс - ООП] Лабораторная работа №4 (Лабораторная работа №4)
Описание файла
Файл "[МГТУ - 2 курс - ООП] Лабораторная работа №4" внутри архива находится в следующих папках: Лабораторная работа №4, [ООП - 2 курс] Лабораторная работа №4. Документ из архива "Лабораторная работа №4", который расположен в категории "". Всё это находится в предмете "объектно-ориентированное программирование (ооп)" из 3 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "объектно-ориентированное программирование (ооп)" в общих файлах.
Онлайн просмотр документа "[МГТУ - 2 курс - ООП] Лабораторная работа №4"
Текст из документа "[МГТУ - 2 курс - ООП] Лабораторная работа №4"
Министерство образования РФ
Государственное образовательное учреждение высшего профессионального образования «Московский государственный технический университет им. Н. Э. Баумана»
Кафедра ИУ5 «Системы Обработки Информации и Управления»
Лабораторная работа №4
по предмету: «Объектно-ориентированное программирование»
на тему: «Наследование, виртуальные функции и абстрактные классы»
Выполнил студент группы ИУ5-31:
Сидякин А.А.
Проверил преподаватель:
Большаков С.А.
Москва 2009
Цель работы: Целью лабораторной работы является дополнительное изучение оболочки (IDE) системы программирования BC 3.1 C++ , способов наследования классов, использование виртуальных функций, понятий абстрактного класса и виртуального вызова функций
-
Порядок выполнения работы:
1) Описание четырех классов (Absrt, Deriv1, Deriv2 и Deriv3) с помощью указателей
2) В классе Absrt определяется свойство char[20]
3) В классах должна быть определена и переопределена виртуальная функция print, для печати переменной и названия класса объекта
4) Описать объекты классов Absrt, Deriv1 ,Deriv2 и Deriv3 (a1, d1, d2, d3), их инициализацию и указатели на эти типы (pa1, pd1, pd2, pd3)
5) Вызвать функцию print
5.1) Задать значения указателей pd1, pd2, pd3 и выполнить вызов функции
5.2) Задать значение pa1 как указатель на d1 и вызвать функцию print
5.3) Задать значение pa2 как указатель на d2 и вызвать функцию print
5.4) Задать значение pa3 как указатель на d3 и вызвать функцию print
6) Описать объект типа список LIST ListDerive
7) Тремя циклами в список (add) последовательно заполнить по пять объектов каждого из типов Deriv1, Deriv2 и Deriv3. Объекты порождаются оператором new. Все объекты должны быть различимы
8) Выполнить распечатку списка с помощью цикла (с использованием класса LISTITERATOR) и функции printOn, перегруженной в классах Deriv1, Deriv2 и Deriv3 (current, restart, int)
9) Выполнить распечатку списка с помощью одного цикла (с использованием класса LISTITERATOR) и функции print, перегруженной в классах Deriv1, Deriv2 и Deriv3 (используя current, restart, int) и вычисляемого указателя на базовый класс (pa1). Для примера ссылки: ((Absrt*) &AI.current())->print()
10) Выполнить удаление элементов из общего списка в одном цикле Deriv1 и Deriv3 и распечатать результат
-
Перечень ошибок исправленных при отладке программы:
1) Неверное определение конструктора в потомках
2) Неверное создание списка объектов
-
Диаграмма классов
-
Листинг программы:
#include <iostream.h>
#include <conio.h>
#include <object.h>
#include <list.h>
class Absrt : public Object
{
public:
Absrt(char strIDX[20]) {str = strIDX;}
virtual ~Absrt() {}
virtual hashValueType hashValue() const {return 0xAA;}
virtual void print(ostream& out) const = 0;
virtual void printOn(ostream& out) {out << str << endl;}
virtual char* get_str(void) const {return str;}
virtual int isEqual(const Object _FAR & m) const = 0;
private:
char* str;
};
class Deriv1 : public Absrt
{
public:
Deriv1(char str[20] = NULL) : Absrt(str) {}
~Deriv1() {}
virtual char _FAR *nameOf() const {return "Deriv1";}
virtual classType isA() const {return 0xAA;}
virtual void print(ostream& out) const {out << get_str() << endl;}
virtual void printOn(ostream& out) const {out << get_str() << endl;}
virtual int isEqual( const Object _FAR & m) const
{
if(m.isA()==isA())
return (((Absrt&)m).get_str()==get_str());
else return 0;
}
};
class Deriv2 : public Deriv1
{
public:
Deriv2(char str[20] = NULL) : Deriv1(str) {}
~Deriv2() {}
virtual char _FAR *nameOf() const {return "Deriv2";}
virtual classType isA() const {return 0xAB;}
};
class Deriv3 : public Deriv1
{
public:
Deriv3(char str[20] = NULL) : Deriv1(str) {}
~Deriv3() {}
virtual char _FAR *nameOf() const {return "Deriv3";}
virtual classType isA() const {return 0xAC;}
};
void main()
{
Absrt* pa1;
Deriv1* d1 = new Deriv1("cat"), *pd1 = d1;
Deriv2* d2 = new Deriv2("eagle"), *pd2 = d2;
Deriv3* d3 = new Deriv3("tiger"), *pd3 = d3;
cout << "Printing containtmens of classes by direct print:" << endl;
cout << "class Deriv1 contains: "; pd1->print(cout);
cout << "class Deriv2 contains: "; pd2->print(cout);
cout << "class Deriv3 contains: "; pd3->print(cout);
cout << endl;
cout << "Printing containtmens of classes by print via pointer:" << endl;
pa1 = pd1;
cout << "class Deriv1 contains: "; pa1->print(cout);
pa1 = pd2;
cout << "class Deriv2 contains: "; pa1->print(cout);
pa1 = pd3;
cout << "class Deriv3 contains: "; pa1->print(cout);
cout << endl;
List ListDerive; int a;
for(a=0; a<5; a++) ListDerive.add(*new Deriv1("word"));
for(a=0; a<5; a++) ListDerive.add(*new Deriv2("anotherword"));
for(a=0; a<5; a++) ListDerive.add(*new Deriv3("andthelastword"));
cout << "Printing list of objects via ListIteratorby printOn:" << endl;
ListIterator &LI=(ListIterator&)ListDerive.initIterator();
LI.restart();
while(LI)
{
LI.current().printOn(cout);
LI++;
}
cout << endl;
cout << " Printing list of objects via ListIteratorby print" << endl;
LI.restart();
while(LI)
{
((Absrt&)(LI.current())).print(cout);
LI++;
}
LI.restart();
cout << endl;
cout << "Deleting objects of Deriv1 and Deriv3 from list..." << endl;
while(LI)
{
pa1=(Absrt*)(&LI.current());
if(pa1->isA()==0xAA)
{
pd1=(Deriv1*)(&LI.current());
LI++;
ListDerive.detach(*pd1,TShouldDelete::Delete);
}
else if(pa1->isA()==0xAC)
{
pd3=(Deriv3*)(&LI.current());
LI++;
ListDerive.detach(*pd3,TShouldDelete::Delete);
}
else LI++;
}
cout << endl << "Printig list of objects without Deriv1 and Deriv3" << endl;
ListDerive.printOn(cout);
getch();
}