русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2015-07-09; просмотров: 819; Нарушение авторских прав


Тема: “Наследование”

Насле́дование — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), поз­во­ля­ющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.

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

Язык С++ отличается от других объектно-ориентированных языков еще и тем, что допускает не только простое наследование, но и множественное наследование, когда данный класс порождается сразу от нескольких родительских классов, наследуя по­ве­дение всех своих предков.

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

 

Ø Простое наследование

 

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

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



Отношение дружественности не наследуется. Это как в реальной жизни: друзья Ва­ших родителей – не обязательно Ваши друзья. Любые отношения дружественности, объ­явленные в классах иерархического дерева наследования, не распространяются по дереву ни вверх, ни вниз.

 

Имя базового класса записывается после имени порожденного класса, отделяясь от него двоеточием.

Когда класс порождается от базового, все имена базового класса в производном классе автоматически становятся частными. Именно такое поведение в С++ по умолчанию. Но его легко изменить, указав следующие спецификаторы доступа для базового класса:

 

Ø private - (спецификатор по умолчанию, если иного при объявлении класса не указано). Все наследуемые имена базового класса с любой формой доступа становятся приватными в производном классе;

Ø public - все общедоступные имена базового класса будут общедоступными в производном классе, и все защищенные имена базового класса будут защищенными и в производном классе.

Ø protected – все общедоступные члены базового класса становятся защи­щен­ны­ми в производном классе. Защищенные и закрытые члены сохраняют свои перво­на­чаль­ные спецификации доступа в производном классе.

Учитывая, что в программировании на язык С++ особое внимание уделяется насле­дованию и повторному использованию, программист тратит много времени на разра­ботку классов, которые являются базовыми для других классов. Привилегий доступа private и public, которые были установлены для первых версий языка, оказалось явно недостаточно, и была введена еще одна привилегия – protected. Любой идентификатор, появившийся в секции protected базового класса, доступен функциям класса (но не поль­зователю). Эта привилегия распространяется вниз по иерархическому дереву не ограничено.

 

Базовый класс, производный класс или оба вместе могут иметь конструкторы и/или деструкторы. Если и у базового, и у производного класса имеются конструкторы и де­структоры, то конструкторы выполняются в порядке наследования, а деструк­торы – в обратном порядке.

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

 

Несмотря на тот факт, что объекты производных классов «являются» также и объектами базового класса, типы объектов производного и базового классов различны. Объекты производного класса можно рассматривать как объекты базового класса. В этом есть смысл, потому что производный класс имеет элементы, соответствующие каждому из элементов базового класса. Но производный класс обычно имеет большее количество элементов, чем его базовый класс. Поэтому присваивание объекта базового класса объекту производного класса оставило бы неопределенными добавочные элементы производного класса.

 

Ø Множественное наследование

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

Спецификатор доступа может быть разным для каждого базового класса, но его необходимо указывать для каждого имени. Когда наследуется множество базовых классов, конструкторы базовых классов выполняются слева направо в порядке, задаваемом в объявлении производного класса. Деструкторы выполняются в обратном порядке.

 

Пример 1: Классы, описывающие точку, окружность и конус.

// файл point.h:

#include <iostream>

using namespace std;

 

// Класс, описывающий точку:

class Point

{

protected:

double x, y;

private:

//---------------------------------------------------------

friend istream& operator >> (istream& is, Point& p)

{

cout << "Задайте координаты точки ";

return is >> p.x >> p.y;

}

friend ostream& operator << (ostream& os, const Point& p)

{

return os << "коордиаты точки: [" <<

p.x << ", " << p.y << "]\n";

}

//----------------------------------------------------------------

public:

Point(double _x=0, double _y=0)

{ x = _x; y =_y;}

};

// файл circle.h:

// Класс, описывающий окружность:

#include "point.h"

#define _USE_MATH_DEFINES

#include <math.h>

class Circle: public Point // Класс Point является базовым для класса Circle

{

friend istream& operator >> (istream& is, Circle& c)

{

cout << "Задайте координаты центра ";

return is >> c.x >> c.y;

cout << "Задайте радиус ";

is >> c.r;

}

friend ostream& operator << (ostream& os, const Circle& c)

{

return os << "Радиус: " << c.r << ", " << Point(c.x, c.y);
// Пример использования функции базового класса

 

}

//----------------------------------------------------------------

protected:

double r; // радиус окружности

public:

// конструктор:

Circle (double _x = 0, double _y = 0, double _r = 0): Point (_x, _y)

{ r = _r;}

double Area ()

{return M_PI* r *r;} // площадь круга

};

// файл cone.h:

// класс, описывающий конус

#define _USE_MATH_DEFINES

#include <math.h>

#include "circle.h"

class Cone : public Circle // класс Cone является производным от класса Circle

{

double h; // высота конуса

friend istream& operator >> (istream&, Cone&);

friend ostream& operator << (ostream&, const Cone&);

public:

//Основной конструктор:

Cone(double _x = 0, double _y = 0, double _r = 0, double _h = 0):

Circle(_x, _y, _r) { h =_h; }

// Конструктор копирования:

Cone(const Cone& cn) { h = cn.h;}

//Функции доступа к закрытым членам:

double Get_h() const {return h;}

//Функции установки значений закрытых членов:

void Set_h(double _h) {h = _h;}

double Volume() { return h * Area() / 3; } // объем конуса

};

//==============================================

// Определение функций:

 

istream& operator >> (istream& is, Cone& cn)

{

cout << "Задайте координаты центра основания и радиус основания ";

is >> cn.x >> cn.y >> cn.r;

cout << "Задайте высоту конуса ";

return is >> cn.h;

}

 

ostream& operator << (ostream& os, const Cone& cn)

{

os << "Высота конуса: " << cn.h << " ";

return os << Circle(cn.r, cn.x, cn.y) << endl;

}

// пример использования класса:

#include <iostream>

#include <conio.h>

#include <windows.h>

#include <iomanip>

#include "cone.h"

using namespace std;

 

int main()

{

//Настройки шрифтов и региональных стандартов:

if(SetConsoleCP(1251)==0)

//проверка правильности установки кодировки символов для ввода

{

cerr<<"Fialed to set codepage!"<<endl;

/* если не удалось установить кодовую страницу, вывод сообщения об ошибке */

}

if(SetConsoleOutputCP(1251)==0)//тоже самое для вывода

{

cerr<<"Failed to set OUTPUT page!"<<endl;

}

Point pt(200,200);

cout<<pt;

cin>>pt;

cout<<pt;

Circle cr(300,200,20);

cout<<cr;

cin>>cr;

cout<<cr<<"площадь окружности"<<cr.Area()<<endl;

Cone cn(450, 200, 50, 90);

cout << "Объем конуса: " <<

setiosflags(ios::fixed) << setprecision(2) << cn.Volume() << endl;

_getch();

return 0;

}



<== предыдущая лекция | следующая лекция ==>
Задания для самостоятельного выполнения | Задания для самостоятельного выполнения


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.963 сек.