Virtual void Speak() const

Отношения между классами и объектами.

Virtual void Speak() const - student2.ru (название лабораторной работы)

по дисциплине «Программирование»

Студент группы ИВТ-12 В.А. Меркулов 10 ВАРИАНТ

Virtual void Speak() const - student2.ru (И. О., Фамилия) Вариант

Преподаватель доцент Л. Ю. Качесова

Барнаул 2012

Вариант 10

Задание 1

Базовый класс «АВИА-РЕЙСЫ» описывает следующие данные-элементы: номер рейса; пункт назначения; цена билета; время отправления; время прибытия на конечный пункт. В класс входят следующие функции: виртуальная функция просмотра информации об авua - рейсах; функция-друг для вывода информации о рейсах, отправляющихся в указанный пункт назначения по указанной цене билета. Производный класс «АВИА-РЕЙСЫ ПО СТРАНЕ» содержит следующие данные: дни вылета; переопределенную функцию просмотра данных о внутренних авua-рейсах. Производный класс «МЕЖДУНАРОДНЫЕ АВИА-РЕЙСЫ» содержит: страна, дата отправления и дата прибытия, переопределенную функцию просмотра данных о международных авua-рейсах.

Алгоритм

Virtual void Speak() const - student2.ru Virtual void Speak() const - student2.ru

Текст программы

#include <iostream>

#include <conio.h>

Using namespace std;

//bazovii class AviaR

Class AviaR

{

friend void function(AviaR p[], int zB,char pN[])

{

if (zB==p->zena)

{

if (strcmp(p->punctNz,pN)==0)

{

P->Display();

cout<<"\n";

}

}

}

protected:

int num; //nomer reysa

char punctNz[25]; //punkt naznachenia

int zena; //zena bileta

char vremOtpr[15];//vrema otpravlenia

char vremPrb[10]; //vrema pribitia

public:

AviaR();

virtual ~ AviaR(){}

virtual void Display();//vivod dannih

};

AviaR::AviaR()

{ //

cout<<"\n Введите номер рейса: ";cin>>num;

cout<<"\n Введите пункт назначения: "; cin>>punctNz;

cout<<"\n введите цену билета: "; cin>>zena;

cout<<"\n введите время отправления: "; cin>>vremOtpr;

cout<<"\n введите время прибытия: "; cin>>vremPrb;

}

void AviaR::Display()

{

cout << "\n номер рейса:" << num;

cout << "\n пункт назначения:" << punctNz;

cout << "\n цена билета:" << zena;

cout << "\n время отправления:"<< vremOtpr;

cout << "\n время прибытия:" << vremPrb;

}

//proizv class AviaR_1 po strane

class AviaR_1 : public AviaR

{

protected:

char dv[10]; //dni vileta

public:

AviaR_1();

virtual ~ AviaR_1(){}

virtual void Display(); //vivod dannih

};

AviaR_1::AviaR_1()

{

cout << "\n Дни вылета:"; cin >> dv;

}

void AviaR_1::Display()

{cout << "\n АВИА-РЕЙСЫ ПО СТРАНЕ: ";

cout << "\n Дни вылета: " << dv << " ";

cout << "\n номер рейса:" << num;

cout << "\n пункт назначения:" << punctNz;

cout << "\n цена билета:" << zena;

cout << "\n время отправления:"<< vremOtpr;

cout << "\n время прибытия:" << vremPrb;

}

// proizv class AviaR_2 mezgorod

class AviaR_2 : public AviaR

{ protected:

char strana [25];

char datotpr[10];

char datprib[10];

public:

AviaR_2();

virtual ~ AviaR_2(){}

Virtual void Display();

};

AviaR_2::AviaR_2()

{

cout << "\n страна:"; cin>> strana;

cout << "\n дата отправления: "; cin>> datotpr ;

cout << "\n дата прибытия: "; cin>> datprib ;

}

void AviaR_2::Display()

{ cout << "\n МЕЖДУНАРОДНЫЕ АВИА-РЕЙСЫ: ";

cout << "\n страна: "<< strana << " ";

cout << "\n дата отправления: " << datotpr << " ";

cout << "\n дата прибытия: " << datprib << " ";

cout << "\n номер рейса:" << num;

cout << "\n пункт назначения:" << punctNz;

cout << "\n цена билета:" << zena;

cout << "\n время отправления:"<< vremOtpr;

cout << "\n время прибытия:" << vremPrb;

}

Int main()

{ setlocale(0,"Rus");

int zb; char pN[25];

int nMenu, flag = 1, kol;

int i = 0;

AviaR* p[100];

cout <<"\n Количество рейсов: ";cin >> kol;

while(i < kol && flag)

{

cout<<"\n Новая запись. Введите: "<< endl;

cout<<"1-Авиа-рейс по стране 2-Международный авиа-рейс 3-выход\n";

cin >> nMenu;

Switch (nMenu)

{ case 1 : p[i++] = new AviaR_1(); break;

case 2 : p[i++] = new AviaR_2(); break;

default : flag = 0; break;

}

}

for (int id = 0; id < kol; id++)

{ p[id]->Display();

}

cout<<"\n\n Введите цену билета:"; cin>>zb;

cout<<"\n\n Введите пункт назначения:"; cin>>pN;

for (int id = 0; id < kol; id++)

{

function(p[id],zb,pN);

}

Getch();

}

Тесты:

Virtual void Speak() const - student2.ru

Задание 2

Класс «ЛЕКАРСТВО» содержит закрытые поля: название лекарства, цена, показания к применению, противопоказания и метод вывода сведений о лекарстве. Класс «АПТЕКА» содержит закрытые поля: название аптеки, номер аптеки, массив объектов класса «ЛЕКАРСТВО», метод поступления новых лекарств в аптеку, метод поиска лекарства по названию и метод вывода списка лекарств аптеки.

Алгоритм

Virtual void Speak() const - student2.ru

Virtual void Speak() const - student2.ru

Virtual void Speak() const - student2.ru

Virtual void Speak() const - student2.ru

Virtual void Speak() const - student2.ru

Virtual void Speak() const - student2.ru

Virtual void Speak() const - student2.ru

Текст программы

#include <iostream>

#include <conio.h>

#include <string>

#include <stdio.h>

Using namespace std;

// objavlenie classa

Class Medican

{

private:

Double zena;

String pok;

String prpok;

public:

char nazv[20];

Medican();

Void Display();

};

Class Apteka

{

private:

char name[20];

Int num;

public:

Medican *p[20];

Int n;

Apteka();

void Poisk(char[]);

Void Display();

Void NewMed();

};

Apteka::Apteka()

{

cout<<"\n vvedite nazvanie apteki: ";cin>>name;

cout<<"\n vvedite nomer apteki: ";cin>>num;

cout<<"\n vvedite kol-vo lekarstv: ";cin>>n;

for (int i=0;i<n;i++)

p[i]=new Medican();

}

void Apteka::NewMed()

{

p[n++]=new Medican();

}

void Apteka::Poisk(char *Nazv)

{

for (int i=0;i<n;i++)

if(strcmp(p[i]->nazv,Nazv)==0)

{

cout<<"\n\n nazvanie apteki: "<<name;

cout<<"\n nomer apteki: "<<num;

p[i]->Display();

}

}

void Apteka::Display()

{

cout<<"\n\n NAZVANIE APTEKI: "<<name;

cout<<"\n NOMER APTEKI: "<<num;

for (int i=0;i<n;i++)

p[i]->Display();

}

Medican::Medican()

{

cout<<"\n vvedite nazvanie lekarstva: "; cin>>nazv;

cout<<"\n vvedite zenu: "; cin>>zena;

cout<<"\n vvedite pokazania k primeneniu: "; cin>>pok;

cout<<"\n vvedite protivopokazania k primeneniu: "; cin>>prpok;

}

void Medican::Display()

{

cout<<"\n\n nazvanie lekarstva: "<<nazv;

cout<<"\n zena: "<<zena<<" RUR";

cout<<"\n pokazania k primeneniu: "<<pok;

cout<<"\n protivopokazania k primeneniu: "<<prpok;

}

Int main()

{

int n,Menu,flag=1,NUMER;

Apteka *q;

char Nazv[20];

cout<<"\n kol-vo aptek:";cin>>n;

q=new Apteka [n];

While(flag)

{

cout<<"\n\n Nazmite:\n 1-Prosmotret' dannie 2-Poisk lekarstva 3-Dobavit' lekarstvo 4-Vihod \n";

cin >> Menu;

Switch (Menu)

{

case 1 :for (int i=0;i<n;i++)

q[i].Display(); break;

case 2 : {cout<<"\n\n poisk: \n";

cout<<"\n vvedite nazvanie lekarstva:";cin>>Nazv;

for (int i=0;i<n;i++)

q[i].Poisk(Nazv); break;}

case 3: {cout<<"\n vvedite nomer apteki, v kot. hotite dobavit' lekarstva:";cin >>NUMER;

q[NUMER-1].NewMed();break;}

default : flag=0; break;

}

}

Getch();

}

Тесты:

Virtual void Speak() const - student2.ru

Virtual void Speak() const - student2.ru

Вопросы (часть 1)

5.Как организовать использование указателя на базовый класс для доступа к методам (не виртуальным) производного класса ? В каком случае деструкторы объявляются виртуальными?

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

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

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

#include <iostream>

#include <conio.h>

class Mammal // Класс млекопитающее

{ protected:

int itsAge; // возраст

public:

Mammal():itsAge(1) {}

virtual ~Mammal(){}

virtual void Speak() const

{ std::cout << "Mammal speak!\n ";}

};

2.Множественное наследование – понятие, синтаксис объявления производного класса.

Наследование называют множественным, когда несколько базовых классов используют для создания нового класса-потомка, наследуемого свойства всех своих родительских классов. При использовании множественного наследования дерево классов может превратиться в сложный граф.

Синтаксис объявления производного класса при множественном наследовании: после имени производного класса ставится двоеточие, за которым следует список указанных через запятую имен базовых классов, каждое из которых предваряется спецификатором доступа (ключевым словом public, protected или private, определяющим доступ к данным базового класса внутри производного).

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

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

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

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

Наши рекомендации