Производные классы: простое наследование 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Производные классы: простое наследование



Основные понятия и определения: базовый класс и производные классы; производный класс есть базовый, обладающий дополнительными возможностями. Производный класс наследует все свойства базового класса и добавляет что-то свое. Отсюда, базовый класс - более абстрактное понятие (шире, чем производный); производный класс - более конкретное понятие (больше - по объему информации, чем базовый класс).

Отсюда:

 

базовый класс

собственные   собственные
Состояние - члены-данные   набор методов

 

 

       
   
 
 


производный класс

от базового класса   от базового класса
собственные   собственные
Состояние - члены-данные   набор методов

 
 

 

 


В производном классе имена методов (и членов - данных) могут совпадать с именами из базового класса.

Простое наследование: правила определения производного класса

Правила объявления производных классов. Две проблемы: могут ли (и как) методы производного класса обращаться к членам базового класса (доступность изнутри производного класса) и как члены базового класса, унаследованные производным классом, могут быть доступны извне производного класса.

Первая проблема решается уровнем видимости членов в базовом классе:

class B{

private:

// закрытая часть класса; не доступна никому, кроме методов класса (в том числе

// не доступна и из производного класса)

protected:

// защищенная часть класса; доступна из методов базового и производного класса

// (но не доступна извне класса)

public:

// открытая часть класса; доступна везде

};

Вторая проблема решается способом наследования:

class D: тип_наследования B{

...

};

тип_наследования: одно из private, protected, public.

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

  тип наследования
уровень видимости в базовом классе private protected public
protected private protected protected
public private protected public

Примеры.

Реализация конструкторов производного класса. Примеры.

Пример производного класса

Пример использования простого наследования: класс “точка” - базовый для класса “окружность”. Методы в классе “точка”: расстояние между двумя точками, вывод координат точки. Для класса окружность: свои дополнительные методы, отсутствовавшие в классе “точка” (пересечение окружностей); полностью наследуется метод - расстояние между точками (центрами двух окружностей) и требуется переопределить метод вывода окружности.

class Point{

protected:

int x, y;

public:

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

Point():x(0), y(0){}

Point(int x0):x(x0),y(x0){}

Point(int x0, int y0):x(x0), y(y0){}

Point(const Point &p):x(p.x), y(p.y){}

void print();

float distance(Point p);

};

Реализация класса:

void Point::print()

{

cout << '(' << p.x << ", " << p.y << ')';

}

float Point::distance(Point p)

{

float dx = x - p.x;

float dy = y - p.y;

return sqrt(dx * dx + dy * dy);

}

Теперь - производный класс Окружность:

class Circle: public Point{

private:

int rad;

public:

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

Circle():rad(0){} // Вызывается пустой конструктор базового класса

Circle(int r):rad(r){}

Circle(int x, int r):Point(x), rad(r){}

Circle(int x, int y, int r):Point(x, y), rad(r){}

Circle(Point p, int r):Point(p), rad(r){}

// методы

void print();

int intersect(Circle c);

};

Теперь - реализация методов

void Circle::print()

{

Point::print();

cout << " with rad " << rad;

}

int Circle::intersect(Circle c)

{

return distance(c) < rad + c.rad;

}

Метод distance из класса Point наследуется классом Circle.

Использование классов:

Circle c1(3), c2(2, 2);

cout << "distance between " << c1 << " and " << c2 << " is " << c1.distance(c2) << endl;

cout << c1 << " and " << c2;

if(c1.intersect(c2))

cout << " are intersected " << endl;

else

cout << " are not intersected " << endl;



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 203; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.129.247.196 (0.006 с.)