Наследование |
Наследование
В наследовании воплощаются принципы иерархической подчиненности классов. Класс, который служит основной для создания нового класса, называется «базовым» или «родительским» классом, или классом «предком», создаваемый класс называется «производным» классом, или же классом «потомком». Производный класс получает все свойства и методы от своего предка, но может быть усовершенствован за счет добавления новых свойств и методов.
Пример:
Рассмотрим класс Point. Который имеет две реализации конструктора, методы Show() и Move().
class Point
{
protected:
int x,y;
public:
Point (): x(100),y(100)
{}
Point (int nx,int ny)
{
x=nx;
y=ny;
}
void Show()
{
cout<<"Coord: ("<<x<<","<<y<<")"<<endl;
}
void Move(int dx, int dy)
{
x+=dx;
y+=dy;
}
};
void main()
{
Point p1;
p1.Show();
p1.Move(10,-10);
p1.Show();
}
Здесь мы использовали спецификатор доступа protected. Объекты, находящиеся в зоне protected, будут недоступны для объектов класса Point, но доступны для методов класса Point, а так же методов производных классов. Для зоны доступа private это утверждение несправедливо. Зона public останется открытой для объектов и методов класса Point, а так же методов и объектов производных классов.
А теперь создадим производный класс Rectangle
class Rectangle : public Point
{
};
Синтаксис следующий:
class Имя_производного_класса : <спецификатор доступа> Имя_базового_класса
Спецификатор доступа, определяет тип доступа к объектам базового класса. Public – означает, что объект производного класса будет иметь доступ к методам базового класса, объявленным в зоне public. Альтернатива, это ключевое слово private, которое перекрывает доступ к методам и классам из зоны public.
В данном случае, производный класс отличается от базового только названием, однако такое использование совершенно справедливо:
void main()
{
Rectangle r;
r.Show();
r.Move(50,-50);
r.Show();
}
Такая реализация не мешает нам создавать объекты и от класса Point.
Point p;
p.Show();
Создание класса потомка Rectangle, не изменяет базовый класс, т. е. на этом уровне класс Point остается классом Point.
Т. к. в производном классе не описаны, т. е. не переопределены какие-либо методы, то в данном случае будут использоваться методы базового класса Move() и Show(). Так же будет использоваться конструктор по умолчанию базового класса. По другому класс прямоугольника можно записать так:
class Rectangle : public Point
{
public:
Rectangle():Point() {}
};
Что значит эта запись? Когда в функции main() мы создаем объект класса Rectangle
Rectangle r;
Запускается конструктор класса Rectangle(), который в свою очередь запускает конструктор базового класса Point(). Причем, в этом случае, сначала выполняется конструктор базового класса. Конструктор может выполнять и еще какие-то действия, но в нашем случае это не требуется.
Однако, если мы захотим воспользоваться конструктором с двумя параметрами, то наткнемся на ошибку компиляции
Rectangle r(200,200);
Указанные параметры нужно как-то передать конструктору базового класса, для этого, может быть записана следующая реализация:
class Rectangle : public Point
{
public:
Rectangle():Point() {}
Rectangle(int nx, int ny):Point (nx,ny) {}
};
И, хотя в конструкторе Rectangle(int nx, int ny) ничего не происходит {}, то при запуске конструктора класса Point(nx, ny), с переданными параметрами, произойдет инициализация свойств x и y.
void main()
{
Rectangle r(200,200);
r.Show();
}
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |