- •Обзорные лекции по курсу
- •1.Концепции и методология объектно-ориентированного программирования
- •2.Классы. Конструкторы и деструкторы
- •Void set_a(int num);
- •Void AnyClass::get_a()
- •Int AnyClass::set_a(int num)
- •Конструкторы и деструкторы. Список инициализации элементов
- •Void Show();
- •Int main()
- •Void Show();
- •Int main()
- •Статические члены класса
- •3. Простое и множественное наследование
- •Int GetX(){return X;}
- •Int GetY(){return у;}
- •Int GetX(){return X;}
- •Int GetY(){return y;}
- •Void ShowX(){cout « GetX() « ' ' ;}
- •Void ShowY(){cout « GetY()« ' ';}
- •OutCoord(int _x, int _y): Coord(_x, _y){}
- •Int GetX() {return X;}
- •Int GetY(){return y;}
- •Void ShowX(){cout « GetX() « ' ';}
- •Void ShowY(){cout « GetY()« ' ';}
- •Void ShowX(){cout « Coord::GetX() « ' ';}
- •PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
- •Void set_a(int num);
- •Void AnyClass::get_a()
- •Int AnyClass::set_a(int num)
- •Void Show();
- •Int main()
- •Int GetX() {return X;}
- •PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
- •Упражнения для самопроверки
3. Простое и множественное наследование
Язык C++ позволяет классу наследовать данные-члены и функции-члены одного или нескольких других классов. При этом новый класс называют производным классом (или классом-потомком). Класс, элементы которого наследуются, называется базовым классом (родительским классом или классом-предком) для своего производного класса. Наследование дает возможность некоторые общие черты поведения классов абстрагировать в одном базовом классе. Производные классы, наследуя это общее поведение, могут его несколько видоизменять, переопределяя некоторые функции-члены базового класса, или дополнять, вводя новые данные-члены и функции-члены. Таким образом, определение производного класса значительно сокращается, поскольку нужно определить только отличающие его от производных классов черты поведения.
Синтаксис объявления производного класса имеет следующий вид:
class Basel //Базовый класс
{
//...
};
class Base2 //Базовой класс
{
//...
};
class BaseN //Базовый класс
{
//...
};
//Производный класс
class Derived : <спецификатор_доступа> Basel,
<спецификатор_доступа> Base2,
…,
<спецификатор_доступа> BaseN
{
//...
};
Здесь <спецификатор_доступа> — это public, protected или private; он не является обязательным и по умолчанию принимает значение private для классов и public для структур. Спецификатор доступа при наследовании определяет уровень доступа к элементам базового класса, который получают элементы производного класса. В приведенной ниже таблице описаны возможные варианты наследуемого доступа.
Таблица 6.2.Наследуемый доступ
Спецификатор наследуемого доступа |
Доступ в базовом классе |
Доступ в производном классе |
public
|
Public Protected Private |
Public Protected Недоступны |
protected
|
Public Protected Private |
Protected Protected Недоступны |
private
|
Public Protected Private |
Private Private Недоступны |
Как следует из таблицы, спецификатор наследуемого доступа устанавливает тот уровень доступа, до которого понижается уровень доступа к членам, установленный в базовом классе. Из этого правила можно сделать исключения. Если спецификатор наследуемого доступа установлен как private, то public-члены базового класса будут являться private-членами в производном классе. Однако можно сделать некоторые из членов базового класса открытыми в производном классе, объявив их в секции public производного класса. Например,
class Base
{
int х,у;
public:
Int GetX(){return X;}
Int GetY(){return у;}
};
class Derived : private Base
{
public:
Base::GetX();
};
main()
{
int x;
Derived ob;
x = ob.GetX() ;
return 0;
}
Таким образом, при таком наследовании открытые и защищенные члены базового класса будут доступны только для членов данного производного класса, и все члены базового класса, кроме явно объявленных в разделе public или protected, будут закрытыми для следующих производных классов. Этот прием позволяет отсечь доступ к членам базового класса при построении иерархии классов с отношением родитель — потомок.
Отметим, что при любом способе наследования в производном классе доступны только открытые (public-) и защищенные (protected-) члены базового класса (хотя наследуются все члены базового класса). Иначе говоря, закрытые члены базового класса остаются закрытыми, независимо от того, как этот класс наследуется.
В С++ не могут наследоваться следующие члены класса:
• конструкторы;
• конструкторы копирования;
• деструкторы;
• операторы присвоения, определенные программистом;
Если у производного класса имеется всего один базовый класс, то говорят о простом (или одиночном) наследовании. Следующий пример иллюстрирует простое наследование.
#include <iostream.h>
class Coord
{
int x, у;
public:
Coord (int _x, int _y) {x = _x; у = _y;}
Coord(){x = 0; у = 0;}