Автор работы: Пользователь скрыл имя, 30 Декабря 2010 в 12:17, реферат
Класс в ООП - это абстрактный тип данных, который включает в себя не только данные, но и функции и процедуры.
Функции и процедуры класса называются методами и содержат исходный код, предназначенный для обработки внутренних данных объекта данного класса.
Теперь дочерние
классы CLine, CRect и CEllipse можно образовывать
от двух базовых CPos и CProp, которые являются
не связанными друг с другом. Для того
чтобы построить класс на основе двух
базовых они указываются друг за другом
через запятую следующим образом:
class CLine : public CPos, public CProp
{
public:
CLine() : CPos(), CProp() {}
CLine(int x1, int y1, int x2, int y2, int w, int clr) :
CPos(x1,y1,x2,y2), CProp(w,clr) {}
~CLine() {}
void Draw() {SetWidth(width); SetColor(color);
MoveTo(sp_x, sp_y); LineTo(ep_x, ep_y);
}
};
Аналогичным образом
строятся классы CRect и CEllipse. Здесь следует
отметить, что конструктор CLine(int x1, int y1,
int x2, int y2, int w, int clr) класса CLine вызывает
конструкторы двух базовых классов, которые
перечислены через запятую с указанием
в них конкретных переменных. Работа с
функциями класса CLine через его представитель
имеет следующий вид:
CLine line;
line.SetProperty(1,0);
line.SetParam(10,10,20,20);
line.Draw();
Благодаря полиморфизму, функции SetProperty() и SetParam() базовых классов вызываются непосредственно из класса CLine.
6.3. Дружественные
классы и функции
В рассмотренных
примерах наследования функция Draw()
дочерних классов использует переменные
sp_x, sp_y, ep_x, ep_y, width и color базовых классов,
которые необходимо было объявлять в разделе
protected. Вместе с тем лучшую защиту этих
переменных можно обеспечить, объявив
их частными (private). Но тогда при наследовании
они оказываются недоступными в производных
классах, а реализация функции Draw() невозможной.
Чтобы разрешить эту проблему, дочерние
классы, использующие частные переменные
базовых классов, необходимо объявить
как дружественные к соответствующим
базовым.
Для объявления дружественного
класса используется ключевое слово
friend, за которым следует имя класса. Следующий
пример демонстрирует объявление дружественного
класса CLine классам CPos и CProp:
class CLine; //идентификатор
класса
class CPos
{
protected:
CPos() {}
CPos(int x1, int y1, int x2, int y2) {SetParam(x1,y1,x2,y2);}
~CPos() {}
public:
friend CLine; //объявление
дружественного класса
void SetParam(int x1, int y1, int x2,
int y2);
protected:
int sp_x, sp_y;
int ep_x, ep_y;
};
class CProp
{
protected:
CProp() {}
CProp(int wdt, int clr) {SetProperty(wdt,clr);}
~CProp();
public:
friend CLine; //объявление
дружественного класса
void SetProperty(int wdt, int clr);
protected:
int width, color;
};
В данном примере
класс CLine является производным от классов
CPos и CProp, поэтому он объявляется после
них. Однако, чтобы сделать класс CLine дружественным
базовым классам он должен быть объявлен
до них, иначе компилятор С++ выдаст синтаксическую
ошибку. Чтобы разрешить эту проблему
язык С++ допускает использование идентификатора
класса, который говорит компилятору о
том, что такой класс есть, но его описание
будет дано ниже. Благодаря этому удается
организовать перекрестные ссылки между
классами, стоящие на разных уровнях иерархии.
В результате такой организации частные
элементы sp_x, sp_y, ep_x, ep_y, width и color классов
CPos и CProp оказываются доступными только
одному производному классу CLine и никакому
другому, что обеспечивает их лучшую защиту
по сравнению с уровнем доступа protected.
Дружественными можно
объявлять не только классы, но и
отдельные функции классов. Например,
для класса CLine важно, чтобы переменные
sp_x, sp_y, ep_x, ep_y, width и color были доступны только
функции Draw(). Поэтому было бы целесообразно
ее и сделать дружественной, а не весь
класс целиком. Однако для этого потребовалось
бы ее прототип описать до классов CPos и
CProp, что сделать в данном случае невозможно,
т.к. класс CLine, в котором находится функция
Draw(), описан в последнюю очередь. Но, в
общем, дружественные функции можно задавать,
как показано в следующем фрагменте программы:
class CPos;
class CLine
{
public:
CLine() {}
~CLine() {}
void Draw(CPos* pos);
};
class CPos
{
public:
CPos() {}
~CPos() {}
friend void CLine::Draw(CPos* pos);
private:
int sp_x, sp_y;
int ep_x, ep_y;
};
void CLine::Draw(CPos* pos)
{
MoveTo(pos->sp_x, pos->sp_y);
LineTo(pos->ep_x, pos->ep_y);
}
Особенностью организации классов CLine и CPos является то, что функция Draw() класса CLine использует в качестве аргумента указатель на класс CPos, который объявлен ниже. Поэтому реализации функции Draw() должна быть объявлена после определения класса CPos, иначе компилятор С++ выдаст сообщение об ошибке. Благодаря тому, что функция Draw() является дружественной классу CPos, она может получать доступ к частным элементам этого класса через переданный ей указатель.
Класс — это множество
объектов, связанных общностью структуры
и поведения. Любой объект является
экземпляром класса. Определение
классов и объектов — одна из
самых сложных задач объектно-
Следующую группу важных
понятий объектного подхода составляют
наследование и полиморфизм. Понятие
полиморфизма может быть интерпретировано,
как способность класса принадлежать
более чем одному типу. Наследование
означает построение новых классов
на основе существующих с возможностью
добавления или переопределения
данных и методов.
Объектно-ориентированная
система изначально строится с учетом
ее эволюции. Наследование и полиморфизм
обеспечивают возможность определения
новой функциональности классов
с помощью создания производных
классов - потомков базовых классов.
Потомки наследуют
ООП
Основные понятия
объектно-ориентированного программирования:
инкапсуляция, наследование и полиморфизм
Мы живем в мире
объектов. Стол, автомобиль, ручка, классная
доска – все это объекты. Наряду
с физическими существуют так
же абстрактные объекты, типичными
представителями которых
Объекты характеризуются
атрибутами. Так атрибутами автомобиля
являются максимальная скорость, мощность
двигателя, цвет кузова и т. д. Атрибутами
усилителя являются частотный диапазон,
выходная мощность, коэффициент нелинейных
искажений, уровень шума и т. д.
Помимо атрибутов
объекты обладают некоторыми функциональными
возможностями, которые в объектно-
Таким образом, объект
инкапсулирует атрибуты и методы,
скрывая от других объектов взаимодействующих
с ним и использующих его функциональность,
свою реализацию. Так для того чтобы
переключить телевизионную
Объект – это экземпляр некоторого класса объектов или просто класса. Так автомобиль Audi 6 является экземпляром класса автомобилей данной модели, приемник Sony SW-7600G так же будет представителем класса одноименных приемников. Таким образом, класс – это абстрактное понятие. Отношение класса и объекта примерно такое же, как платоновские идеи и объекты реального мира. На UML – унифицированном языке моделирования – класс отображается в виде прямоугольника, разделенного на три части. В первой содержится имя класса, во второй – атрибуты, в третьей – методы (рис. 1, а).
Классы могут быть
связаны друг с другом различными
отношениями. Одним из основных таких
отношений является отношение класс
– подкласс, известный в объектно-
При наследовании все
атрибуты и методы родительского
класса наследуются классом-потомком.
Наследование может быть многоуровневым,
и тогда классы, находящиеся на
нижних уровнях иерархии, унаследуют
все свойства (атрибуты и методы)
всех классов, прямыми или косвенными
потомками которых они
Помимо единичного,
существует и множественное наследование,
когда класс наследует сразу
нескольким классам (рис. 1, с). При этом
он унаследует свойства всех классов,
потомком которых он является. При
использовании множественного наследования
необходимо быть особенно внимательным,
так как возможны коллизии, когда
класс-потомок может
При наследовании одни методы класса могут замещаться другими. Так, класс транспортных средств будет обладать обобщенным методом движения. В классах-потомках этот метод будет конкретизирован: автомобиль будет ездить, самолет – летать, корабль – плавать