Отчет_лаб4 (1077298)
Текст из файла
Московский государственный технический университет им. Н.Э.Баумана
_________________________________________________________________
Лабораторная работа №4 по дисциплине ПППО
«Наследование, виртуальные функции и абстрактные классы »
ИСПОЛНИТЕЛЬ: | |
студент группы ИУ5-63 | _____________________ |
Абламцев Д.М. | "__"_____________2006 г. |
Москва - 2006
________________________________________________________________
-
Цель работы
Целью лабораторной работы является дополнительное изучение оболочки (IDE) системы программирования BC 3.1 C++ , способов наследования классов, использование виртуальных функций, понятий абстрактного класса и виртуального вызова функций. Студенты создают свои классы и исследуют механизмы вызова виртуальных функций. Учатся проектировать собственные классы и отображать результаты на диаграммах классов и объектов.
Код задания: 1B, 2.1В, 3.3В
-
Порядок работы:
В лабораторной работе в изложенном ниже порядке должны быть отражены следующие требования:
Обязательные требования:
-
Описание четырех классов( Absrt, Deriv1 ,Deriv2 и Deriv3), требования к которым описаны выше (см. 1-й пункт вариантов).
-
В классе Absrt определяется свойство, задаваемое вариантом (см. 2-й пункт вариантов).
-
В классах должна быть определена и переопределена виртуальная функция print, для печати переменной и названия класса объекта.
-
Описать объекты классов Absrt, Deriv1 ,Deriv2 и Deriv3( a1, d1, d2, d3) и их инициализация и указателей на эти типы( pa1, pd1, pd2, pd3);
-
Выполнить вызов функции print для имен объектов ( d1, d2, d3).
-
Задаются значения указателей( pd1, pd2, pd3) и выполняется вызов функции print для этих указателей.
-
Задается значение pa1 как указатель на d1 и вызывается функции print через этот указатель. Задается значение pa1 как указатель на d2 и вызывается функции print через этот указатель. Задается значение pa1 как указатель на d3 и вызывается функции print через этот указатель( виртуальный вызов !!).
-
Описать объект типа список LIST ListDerive.
-
Тремя циклами в список ( add) последовательно заполнить по пять объектов каждого из типов Deriv1 ,Deriv2 и Deriv3. Объекты порождаются оператором new. Все объекты должны быть различимы.
-
Выполнить распечатку списка с помощью цикла (с использованием класса LISTITERATOR см. 3ЛР) и функции printOn, перегруженной в классах Deriv1 ,Deriv2 и Deriv3( current, restart, int).
-
Выполнить распечатку списка с помощью одного цикла (с использованием класса LISTITERATOR см. 3ЛР) и функции print, перегруженной в классах Deriv1 ,Deriv2 и Deriv3( используя current, restart, int) и вычисляемого указателя на базовый класс (pa1). Для примера ссылки: (( Absrt*) &AI.current())->print();
-
Выполнить удаление элементов из общего списка по вариантам (см. 3-й пункт вариантов).
Дополнительные требования (выполняются по желанию сильными студентами):
-
Все тоже с классами DOUBLELIST и DOUBLELISTITERATOR;
Продемонстрировать использование виртуального класса на примере.
-
Перечень ошибок исправленных при отладке программы
Проблемы при удалении элементов.
-
Диаграмма классов
5. Листинги программ.
//Lab4.cpp
#include <iostream.h>
#include <dbllist.h>
#include <conio.h>
#include "info.h"
class _CLASSTYPE Absrt : public Object
{
public:
Absrt(int s=0) {inum=s;}
virtual ~Absrt() {}
virtual hashValueType hashValue() const
{return 0xAA;}
virtual void printOn(ostream& out) const
{ out << inum << endl;}
virtual int get_inum(void) const
{return inum;}
virtual void print(ostream& out) const=0;
virtual int isEqual( const Object _FAR & m) const=0;
private:
int inum;
};
class _CLASSTYPE Deriv1 : public Absrt
{
public:
Deriv1(int inum=0): Absrt(inum) {}
~Deriv1() {}
virtual char _FAR *nameOf() const
{ return "Deriv1 ";}
virtual classType isA() const
{return 0xAA;}
virtual void printOn(ostream& out) const
{out << get_inum() << endl;}
virtual void print(ostream& out) const
{out << nameOf(); printOn(out);}
virtual int isEqual( const Object _FAR & m) const
{
if(m.isA()==isA())
return (((Absrt&)m).get_inum()==get_inum());
else return 0;
}
};
class _CLASSTYPE Deriv2 : public Deriv1
{
public:
Deriv2(int inum=0): Deriv1(inum) {}
~Deriv2() {}
virtual char _FAR *nameOf() const
{ return "Deriv2 ";}
virtual classType isA() const
{return 0xAB;}
/* virtual void printOn(ostream& out) const
{out << get_inum() << endl;}
virtual void print(ostream& out) const
{out << nameOf(); printOn(out);}
virtual int isEqual( const Object _FAR & m) const
{
if(m.isA()==isA())
return (((Absrt&)m).get_inum()==get_inum());
else return 0;
} */
};
class _CLASSTYPE Deriv3 : public Deriv1
{
public:
Deriv3(int inum=0): Deriv1(inum) {}
~Deriv3() {}
virtual char _FAR *nameOf() const
{ return "Deriv3 ";}
virtual classType isA() const
{return 0xAC;}
/* virtual void printOn(ostream& out) const
{out << get_inum() << endl;}
virtual void print(ostream& out) const
{out << nameOf(); printOn(out);}
virtual int isEqual( const Object _FAR & m) const
{
if(m.isA()==isA())
return (((Absrt&)m).get_inum()==get_inum());
else return 0;
} */
};
void main(void)
{
Absrt *pa;
Deriv1 d1(1), *pd1=&d1;
Deriv2 d2(2), *pd2=&d2;
Deriv3 d3(3), *pd3=&d3;
PrintInfo();
cout << "Âûâîä îáúåêòîâ d1,d2,d3: " << endl;
d1.print(cout);
d2.print(cout);
d3.print(cout);
cout << "Âûâîä îáúåêòîâ d1,d2,d3 ÷åðåç óêàçàòåëè: " << endl;
pd1->print(cout);
pd2->print(cout);
pd3->print(cout);
cout << "Âûâîä îáúåêòîâ d1,d2,d3 ÷åðåç óêàçàòåëü íà àáñòðàêòíûé êëàññ: " << endl;
pa=pd1;
pa->print(cout);
pa=pd2;
pa->print(cout);
pa=pd3;
pa->print(cout);
getch();
DoubleList ListDeriv;
for(int i=0;i<5;i++)
ListDeriv.add(* new Deriv1(i));
for(i=0;i<5;i++)
ListDeriv.add(* new Deriv2(i+5));
for(i=0;i<5;i++)
ListDeriv.addAtTail(* new Deriv3(i+10));
DoubleListIterator &LI=(DoubleListIterator&)ListDeriv.initIterator();
LI.restart();
cout << " PrintOn with ListIterator:" << endl;
while(LI)
{
LI.current().printOn(cout);
LI++;
}
getch();
LI.restart();
cout << " Print with ListIterator:" << endl;
while(LI)
{
((Absrt&)(LI.current())).print(cout);
LI++;
}
LI.restart();
getch();
while(LI)
{
pa=(Absrt*)(&LI.current());
if(pa->isA()==0xAA)
{
pd1=(Deriv1*)(&LI.current());
LI++;
ListDeriv.detach(*pd1,TShouldDelete::Delete);
}
else if(pa->isA()==0xAB)
{
pd2=(Deriv2*)(&LI.current());
LI++;
ListDeriv.detach(*pd2,TShouldDelete::Delete);
}
else
LI++;
}
cout << "Ïîñëå óäàëåíèÿ ýëåìåíòîâ Deriv1 è Deriv2: " << endl;
ListDeriv.printOn(cout);
}
5
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.