
2.4 Наследование
Рассмотрим как можно определить наследование одного класса другим в С++:
class имя_производного_класса : атрибут_наследования имя_базового класса {...};
Атрибут наследования определяется тремя известными ключевыми словами: private, public and protected., которые использовались для доступа к внутренним компонентам классов. Данный атрибут при наследовании определяет видимость компонент базового класса внутри производного.
1. public - открытый (общий). Доступ к элементам класса может быть осуществлен из самого класса так и извне класса. Все переменные или функции объявленные после ключевого слова public, являются публичными, т.е. доступными для всех других функций в программе.
2. private - закрытый (частный). Доступ к элементам класса может быть осуществлен только из функций самого класса.
3. protected – защищенный, разрешен функциям класса, которые являются друзьями класса.
По умолчанию все элементы класса имеют атрибут доступа private. Атрибут задается ключевым словом и символом (:). Действие атрибута сохраняется до следующего атрибута или до закрывающей фигурной скобки в объявлении класса.
class С
{
int X;
public:
int function();
private:
int Y;
};
Рассмотрим как атрибут наследования влияет на видимость компонент базового класса.
Рисунок 12.1 - Влияние атрибутов на видимость компонент
Спецификатор доступа в базовом классе |
Спецификатор наследования | ||
Public |
protected |
Private | |
Public |
Public |
protected |
Private |
Protected |
Protected |
protected |
Private |
Private |
нет доступа |
нет доступа |
нет доступа |
Спецификатор наследования определяет то, как элементы базового класса наследуются производным классом.
Если public, то все открытые члены базового классаостаются открытыми в производном. Если закрытый, то все открытые члены базового класса в производном становятся закрытыми. Закрытые остаются закрытыми и не доступными. Важно понимать, хотя открытые члены базового класса становятся закрытыми в производном, они остаются доступными для функций – членов производного класса.
Атрибут наследования protected эквивалентен private, только за одним исключением - все компоненты базового класса с атрибутом доступа protected, доступны для членов всех производных классов этого базового класса. Вне базового или производных классов защищенные члены не доступны. Разница между private и protected проявляется только при наследовании классов.
Для доступа к элементам класса используется символ (.) или символы (->) если используется не имя объекта а указатель.
Cobj;
obj.X; obj.Y; //неправильно!!!
int n=obj.function;
или
C *obj;
obj->X; obj->Y;
int n=obj->function;
Оператор :: называется оператором разрешения области видимости и служит той же цели, что и оператор точка. Оператор разрешения области видимости используется с именем класса, в то время как оператор точка используется с именем объекта.
Базовый класс может наследоваться производным классом как защищенный. В этом случае открытые и защищенные члены базового класса становятся защищенными членами производного класса. Закрытые члены базового класса остаются закрытыми.Технически атрибут наследования не обязателен. Если он не указан и производный класс определен с ключевым словом class, то базовый класс по умолчанию наследуется как закрытый. Тем не менее для ясности предпочтительно явное задание атрибута доступа. |