Скачиваний:
26
Добавлен:
20.06.2014
Размер:
37.71 Кб
Скачать

Лабораторная работа №6

Дисциплина: «Объектно-ориентированное программирование».

Тема: «Особенности наследования классов».

Выполнил: Янковский Д.В.

Проверил; Фефелов С.И.

Задание: Отладить и организовать корректную работу, представленной ниже, программы:

Листинг №1:

#include <iostream.h>

struct Basel {

Base1() { cout<< "Создание Base1"<<endl; )

};

struct Base2{

Base2() { cout<< "Создание Base2"<<endl; }

};

Base3() { cout<< "Создание Base3"<<endl; )

};

struct Base4{

Base4() { cout<< "Создание Base4"<<endl; }

};

struct Derived : private Basel, private Base2,prlvate Base3 {

Base4 anObject;

Derived() {}

};

void main() {

Derived anObJect;

}

Исправления:

  • Добавлена функция system(“pause”) для просмотра результата в консоли.

  • Добавлено определение пространства имён using namespace std, для использования краткого обращения к функциям cout и cin.

  • Исправлено описание заголовка <iostream>.

  • Исправлены различные ошибки распознавания текста.

  • Для проверки работы наследования были добавлены в конструктор для Derived конкретные вызовы с другим порядком и изменён порядок наследования классов.

  • Для отображения корректного русских символов в консоли была добавлена функция setlocale( LC_ALL, "Russian" ).

#include <iostream>

using namespace std;

struct Base1

{

Base1(){ cout<< "Создание Base1"<<endl; }

};

struct Base2

{

Base2() { cout<< "Создание Base2"<<endl; }

};

struct Base3

{

Base3() { cout<< "Создание Base3"<<endl; }

};

struct Base4

{

Base4() { cout<< "Создание Base4"<<endl; }

};

/*

struct Derived : private Base1, private Base2,private Base3

{

Base4 anObject;

Derived() {}

};*/

struct Derived : private Base2, private Base1, private Base3

{

Base4 anObJect;

Derived() : anObJect(), Base1(), Base2(), Base3() {}

};

void main()

{

setlocale( LC_ALL, "Russian" );

Derived anObJect;

system("pause");

}

Исправления:

  • Добавлен новый класс.

Листинг №2.

#include <iostream> // для cin, cout

#include <process.h> // для exit()

#include <conio.h>

using namespace std;

class Vector

{

public:

float Re; // Дейcтвительная и

float Im; // мнимая чаcти чиcла

};

class Complex: virtual public Vector

{

public:

Complex (float r=0, float i=0)

{

Re=r;

Im=i;

}

void Sum (Complex, Complex); // Фyнкции

void Minus (Complex, Complex); // арифметики

void Mult (Complex, Complex); //

void Div (Complex, Complex); //

void Get (); // Фyнкции ввода

void Put (); // и вывода

};

void Complex :: Sum ( Complex x, Complex y ) // cyмма чиcел

{

Re = x.Re + y.Re; Im = x.Im + y.Im;

}

void Complex :: Minus ( Complex x, Complex y ) // Разноcть

{

Re = x.Re - y.Re; Im = x.Im - y.Im;

}

void Complex :: Mult ( Complex x, Complex y ) //Произведение

{

Re = x. Re * y. Re - x.Im * y.Im; Im = x.Re * y.Im + x.Im * y.Re;

}

void Complex ::Div ( Complex x, Complex y ) // Деление

{

if ( !(y.Re || y.Im ) ) {

cout << "Деление на ноль!"; exit (12);

}

Re = (x.Re * y.Re + x.Im * y.Im) / (y.Re * y.Re + y.Im * y.Im);

Im = (y.Re * x.Im - x.Re * y.Im) / (y.Re * y.Re + y.Im * y.Im);

}

void Complex:: Get () // Ввод c клавиатyры

{

cout <<"Введите дейcтвительнyю чаcть чиcла:";

cin >> Re;

cout << "Введите мнимyю чаcть чиcла: ";

cin >> Im;

}

void Complex:: Put ( ) // Вывод на экран

{

cout << "\nДейcтвительная чаcть чиcла:" << Re;

cout << "\nМнимая чаcть чиcла: " << Im;

}

// Программа проверки работоcпоcобноcти клаccа

// комплекcных чиcел " Complex

void main()

{

setlocale( LC_ALL, "Russian" );

Complex a(1,2), b(2,1);

a.Put();

b.Put();

Complex c; // Определение объектов a,b,c

cout << "\nСумма:";

c.Sum(a, b); // cyмма а и b помещетcя в c

c.Put(); // Вывод резyльтата на экран

cout << "\nЧастное:";

c.Div(a, b);

c.Put();

cout << "\nПроизведение:";

c.Mult(a, b);

c.Put();

cout << "\nРазность:";

c.Minus(a, b);

c.Put();

system(“pause”);

}

Контрольные вопросы.

  1. Что такое множественное наследование, в каких случаях необходимо его использовать?

Множественное наследование означает, что класс имеет несколько базовых классов.

Множественное наследование применяется для того, чтобы обеспечить производный класс свойствами двух или более базовых. Чаще всего один из этих классов является основным, а другие обеспечивают некоторые дополнительные свойства, поэтому они называются классами подмешивания. По возможности классы подмешивания должны быть виртуальными и создаваться с помощью конструкторов без параметров, что позволяет избежать многих проблем, возникающих при ромбовидном наследовании (когда у базовых классов есть общий предок)

  1. Как используются абстрактные классы?

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

Чистая виртуальный метод – это метод, для которого программист не планирует иметь каких-либо реализаций. Например:

class Employee {

private:

char name[40];

public:

Employee(char* n);

//Чистая виртуальная функция

virtual void* promote()=0;

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

  1. Как располагаются в памяти ЭВМ элементы объектов производных классов?

struct Ваse {

int а;

float b;

void fl();

}

struct Derived : public Base {

int c;

} object;

Рассматривая размещение объекта производного класса Derived в памяти:

Base* —

int а

Base

Derived*—

float b

Derived

int c

Если Derived* передан в функцию, ожидающую получения Base*, никаких проблем не возникает. Класс Derived совпадает с классом Base во всем, что касается его части, перекрывающейся с Base. То же самое касается и вызова функции object.fl(). Передаваемый указатель this имеет одно и то же значение, безотносительно к типу.

  1. Как располагаются в памяти ЭВМ элементы объектов классов с множественным наследованием?

struct Basel {

int а; float b;

void fl();

};

struct Base2{<

int с; float d;

void f2();

};

struct Derived: public Basel, public Base2 {

int e;

} object;

Примерная схема памяти:

Basel*—

int a

Basel

Derived*—

float b

Base2*—

int c

Base2

Derived

float d

int e

Класс Base2 более не находится в начале класса Derived. Если попробовать передать Derived* функции, ожидающей поступления Basel*, то проблем не возникнет. Вместе с тем, при вызове функции, ожидающей поступления Base2*, полученный ей адрес окажется неправильным.

Чтобы исправить этот адрес, необходимо прибавить к адресу Derived:: object смещение Base2 в Derived Таким образом, чтобы результат указывал на ту часть, которая относится к Base2. Такая же коррекция должна выполняться для каждого случая приведения типа указателей на Derived* в Base2*, включая и скрытый указатель this, передаваемый компонентным функциям Base2.

  1. Что такое виртуальное наследование?

Виртуальное наследование в языке C++ — один из вариантов наследования, который необходим для решения некоторых проблем, порождаемых наличием возможности множественного наследования, путем разрешения неоднозначности того, методы которого из суперклассов (непосредственных классов-предков) необходимо использовать. Оно применяется в тех случаях, когда множественное наследование вместо предполагаемой полной композиции свойств классов-предков приводит к ограничению доступных наследуемых свойств вследствие неоднозначности. Базовый класс, наследуемый множественно, определяется виртуальным с помощью ключевого слова virtual. Виртуальное наследование решает проблему наследования нескольких экземпляров базового класса, когда нужен только один разделяемый экземпляр.

  1. В каких случаях указатель подкласса совпадает с указателем суперкласса?

Если метод подкласса совпадает с методом суперкласса (порождающего класса), то метод подкласса переопределяет метод суперкласса.

Соседние файлы в папке Отчеты