rlab4 (1077311)
Текст из файла
10
| Утверждаю: | |
| Большаков С.А. | "__"_____________2007 г. |
Лабораторная работа №4
"Наследование, виртуальные функции и абстрактные классы"
Отчет
(вид документа)
писчая бумага
(вид носителя)
10
(количество листов)
| ИСПОЛНИТЕЛЬ: | |
| студент группы ИУ5-54 | _____________________ |
| Киреев И. А. | "__"_____________2007 г. |
Москва - 2007
________________________________________________________________
1. Цель работы
Целью лабораторной работы является дополнительное изучение оболочки (IDE) системы программирования BC 3.1 C++ , способов наследования классов, использование виртуальных функций, понятий абстрактного класса и виртуального вызова функций. Студенты создают свои классы и исследуют механизмы вызова виртуальных функций. Учатся проектировать собственные классы и отображать результаты на диаграммах классов и объектов.
2. Содержание работы
В ЛР нужно выполнить следующее:
-
Порядок и особенности работы с оболочкой: использование отладчика и средств просмотра классов;
-
Выполнить описание четырех собственных классов (Absrt, Deriv1 ,Deriv2 и Deriv3 названия классов нельзя изменять), связанных следующим образом: Absrt - абстрактный класс, наследованный от Object ( из classlib); Deriv1 - наследуется от Absrt, Deriv2 наследуется от Deriv1, Deriv3 наследуется от Deriv1.
-
Классы Deriv1 ,Deriv2 и Deriv3, не являются абстрактными и имеют, по крайней мере, одну виртуальную функцию, определенную в классе Absrt как чистая виртуальная функция (тело такой функции обозначается так - "=0").
-
Построить диаграмму наследования классов для ЛР.
-
Описать объекты классов Absrt, Deriv1 ,Deriv2 и Deriv3(названия фиксированы - a1, d1, d2, d3) и выполнить их инициализацию и инициализацию указателей на эти типы, которые описываются отдельно( pa1, pd1, pd2, pd3);
-
Построить диаграмму объектов для лабораторной работы.
-
Выполнить вызовы виртуальных функций всех классов и объектов через имена объектов и указатели, в том числе через указатель на базовый абстрактный класс( pa1) – это виртуальный вызов!!!.
-
Занести объекты разных типов в один список типа LIST (из classlib см. ЛР 3).
-
Распечатать списка с помощью цикла, функции printOn и собственной виртуальной функции print , на основе класса LISTITERATOR.
Требования к работе
В лабораторной работе в изложенном ниже порядке должны быть отражены следующие действия:
-
Описание четырех классов( 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;
-
Продемонстрировать использование виртуального класса на примере.
Вариантные требования:
-
Создание всех новых классов с помощью указателей или без
1В – с указателем -
В классе Absrt определяется свойство (2В)
Типа int (2.1В)
-
По завершению в одном цикле по списку удалить объекты классов, заданных ниже, и распечатать результат (3В)
Deriv2 и Deriv3 (3.2В)
3. Перечень ошибок
1. При определении в дочерних классах чисто виртуальных функций, определенных в базовом классе необходимо учитывать сигнатуру функций. Например различны функции:
virtual void printOn( ostream _FAR & ) const = 0;
virtual void printOn( ostream _FAR & ) = 0;
4. Диаграмма классов
5. Диаграмма объектов.
6. Листинги программ
6.1. lab41.cpp
#include <conio.h>
#include <iostream.h>
#include <list.h>
#include <dbllist.h>
#include "mycls.h"
#define COUNT 5
void Help( void );
void main( void )
{
//Заголовок
Help();
Abstr* pa1;
Deriv1 d1( 11 ), *pd1;
Deriv2 d2( 12 ), *pd2;
Deriv3 d3( 13 ), *pd3;
cout << "Печать объекта:\n";
d1.print( cout );
d2.print( cout );
d3.print( cout );
pd1 = &d1;
pd2 = &d2;
pd3 = &d3;
cout << "Печать с помощью указателЯ: \n";
pd1->print( cout );
pd2->print( cout );
pd3->print( cout );
cout << "Виртуальный вызов: \n";
pa1 = &d1;
pa1 -> print( cout );
pa1 = &d2;
pa1 -> print( cout );
pa1 = &d3;
pa1 -> print( cout );
(void)getch();
cout << "Печать из списка: \n";
DoubleList ListDeriv;
int i=0, j=100;
for( i=0; i<5; i++, j++ )
ListDeriv.add( *new Deriv1( j ) );
for( i=0; i<5; i++, j++ )
ListDeriv.add( *new Deriv2( j ) );
for( i=0; i<5; i++, j++ )
ListDeriv.add( *new Deriv3( j ) );
ListDeriv.printOn( cout );
(void)getch();
cout << "Печать из списка с помощью цикла: \n";
DoubleListIterator iL( ListDeriv );
iL.restart();
while( int(iL))
{
((Abstr &)iL.current()).print( cout );
iL++;
}
(void)getch();
cout << "Очистка с фильтром: \n";
Deriv1* Temp = new Deriv1(0);
while( *( pa1 = (Abstr*)&ListDeriv.findMember( *Temp )) != NOOBJECT )
ListDeriv.detach( *pa1 );
delete Temp;
ListDeriv.printOn( cout );
(void)getch();
cout << "Виртуальное наследование: \n";
cout << "sizeof (vX) = " << sizeof( vX ) << endl;
cout << "sizeof (vA) = " << sizeof( vA ) << endl;
cout << "sizeof (vB) = " << sizeof( vB ) << endl;
cout << "sizeof (vY) = " << sizeof( vY ) << endl;
cout << "Без виртуального наследования: \n";
cout << "sizeof (X) = " << sizeof( X ) << endl;
cout << "sizeof (A) = " << sizeof( A ) << endl;
cout << "sizeof (B) = " << sizeof( B ) << endl;
cout << "sizeof (Y) = " << sizeof( Y ) << endl;
}
6.2. lab22.cpp
#include <iostream.h>
//Вывод справки
void Help( void )
{
cout << "\
ЛАБОРАТОРНАЯ РАБОТА №4\n\
КИРЕЕВ ИВАН ИУ5-64\n\
ВАРИАНТ 9\n\n";
}
6.3. MyCls.h
class Abstr : public Object
{
public:
Abstr( int i ) : Object(), Var(i) {};
int Var;
virtual void print( ostream _FAR & ) = 0;
};
class Deriv1 : public Abstr
{
public:
Deriv1( int i ) : Abstr(i) {};
virtual void print( ostream _FAR & out)
{ out << "Deriv1: Var = " << Var << endl;};
virtual classType isA() const {return 0;};
virtual char _FAR *nameOf() const {return "Object.Abstr.Deriv1";};
virtual hashValueType hashValue() const {return 0;};
virtual int isEqual( const Object _FAR & Obj ) const
{ return 0;};
virtual void printOn( ostream _FAR & out ) const
{ out << nameOf() << ": Var = " << Var;};
};
class Deriv2 : public Deriv1
{
public:
Deriv2( int i ) : Deriv1(i) {};
virtual void print( ostream _FAR & out)
{ out << "Deriv2: Var = " << Var << endl;};
virtual classType isA() const {return 0;};
virtual char _FAR *nameOf() const {return "Object.Abstr.Deriv2";};
virtual hashValueType hashValue() const {return 0;};
virtual int isEqual( const Object _FAR & Obj ) const
{ return 1;};
virtual void printOn( ostream _FAR & out ) const
{ out << nameOf() << ": Var = " << Var;};
};
class Deriv3 : public Deriv1
{
public:
Deriv3( int i ) : Deriv1(i) {};
virtual void print( ostream _FAR & out)
{ out << "Deriv3: Var = " << Var << endl;};
virtual classType isA() const {return 0;};
virtual char _FAR *nameOf() const {return "Object.Abstr.Deriv3";};
virtual hashValueType hashValue() const {return 0;};
virtual int isEqual( const Object _FAR & Obj ) const
{ return 1;};
virtual void printOn( ostream _FAR & out ) const
{ out << nameOf() << ": Var = " << Var;};
};
class vX
{
public:
char x[32];
};
class vA: public virtual vX
{
char a[16];
};
class vB: public virtual vX
{
char b[8];
};
class vY: public vA, public vB
{
};
class X
{
public:
char x[32];
};
class A: public X
{
char a[16];
};
class B: public X
{
char b[8];
};
class Y: public A, public B
{
};
7. Результаты работы программы.
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\Киреев>C:\A_WORKER\out\LAB4.EXE
ЛАБОРАТОРНАЯ РАБОТА ╣4
КИРЕЕВ ИВАН ИУ5-64
ВАРИАНТ 9
Печать объекта:
Deriv1: Var = 11
Deriv2: Var = 12
Deriv3: Var = 13
Печать с помощью указателЯ:
Deriv1: Var = 11
Deriv2: Var = 12
Deriv3: Var = 13
Виртуальный вызов:
Deriv1: Var = 11
Deriv2: Var = 12
Deriv3: Var = 13
Печать из списка:
DoubleList {
Object.Abstr.Deriv3: Var = 114,
Object.Abstr.Deriv3: Var = 113,
Object.Abstr.Deriv3: Var = 112,
Object.Abstr.Deriv3: Var = 111,
Object.Abstr.Deriv3: Var = 110,
Object.Abstr.Deriv2: Var = 109,
Object.Abstr.Deriv2: Var = 108,
Object.Abstr.Deriv2: Var = 107,
Object.Abstr.Deriv2: Var = 106,
Object.Abstr.Deriv2: Var = 105,
Object.Abstr.Deriv1: Var = 104,
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.















