Лекция
Привет, сегодня поговорим про наследование полиморфизм, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое наследование полиморфизм, виртуальные функции, определение производного класса , настоятельно рекомендую прочитать все из категории С++ (C plus plus).
Наследование- это механизм получения нового класса на основе уже существующего. Существующий класс может быть дополнен или изменен для создания нового класса.
Существующие классы называются базовыми, а новые – производными. Производный класс наследует описание базового класса; затем он может быть изменен добавлением новых членов, изменением существующих функций- членов и изменением прав доступа. Таким образом, наследование позволяет повторно использовать уже разработанный код, что повышает производительность программиста и уменьшает вероятность ошибок. С помощью наследования может быть создана иерархия классов, которые совместно используют код и интерфейсы.
Наследуемые компоненты не перемещаются в производный класс, а остаются в базовых классах. Сообщение, обработку которого не могут выполнить методы производного класса, автоматически передается в базовый класс. Если для обработки сообщения нужны данные, отсутствующие в производном классе, то их пытаются отыскать автоматически и незаметно для программиста в базовом классе.При наследовании некоторые имена методов и данных базового класса могут быть по-новому определены в производном классе. В этом случае соответствующие компоненты базового класса становятся недоступными из производного класса. Для доступа к ним используется операция указания области видимости ‘ : : ’.
В иерархии производный объект наследует разрешенные для наследования компоненты всех базовых объектов (public, protected).
Допускается множественное наследование – возможность для некоторого класса наследовать компоненты нескольких никак не связанных между собой базовых классов. В иерархии классов соглашение относительно доступности компонентов класса следующие:
private – Член класса может использоваться только функциями- членами данного класса и функциями- “друзьями” своего класса. В производном классе он недоступен.
protected – То же, что и private, но дополнительно член класса с данным атрибутом доступа может использоваться функциями- членами и функциями- “друзьями” классов, производных от данного.
public – Член класса может использоваться любой функцией, которая является членом данного или производного класса, а также к public - членам возможен доступ извне через имя объекта.
Следует иметь в виду, что объявление friend не является атрибутом доступа и не наследуется.
Синтаксис определение производного класса :
class имя_класса : список_базовых_классов
{список_компонентов_класса};
В производном классе унаследованные компоненты получают статус доступаprivate, если новый класс определен с помощью ключевого слова class, и статусpublic, если с помощью struct
Например.
а) class S : X,Y,Z{. Об этом говорит сайт https://intellect.icu . . .};
S – производный класс;
X,Y,Z – базовые классы.
Здесь все унаследованные компоненты классов X,Y,Z в классе A получают статус доступа private.
б) struct S : X,Y,Z{. . .};
S – производный класс;
X,Y,Z – базовые классы.
Здесь все унаследованные компоненты классов X,Y,Z в классе A получают статус доступа public.
Явно изменить умалчиваемый статус доступа при наследовании можно с помощью атрибутов доступа – private, protected и public, которые указываются непосредственно перед именами базовых классов. Как изменяются при этом атрибуты доступа в производном классе показано в следующей таблице
атрибут, указанный при наследовании
|
атрибут в базовом классе
|
атрибут, полученный в производном классе
|
public |
public protected |
public protected |
protected |
public protected |
protected protected |
private |
public protected |
private private |
рис. Взаимосвязь классов при наследовании
Пример 2.1.1
Пример 2.1.1
class B {
protected: int t;
public: char u;
private: int x;
};
struct S : B{ }; // наследуемые члены t, u имеют атрибут доступа public
class E : B{ }; // t, u имеют атрибут доступа private
class M : protected B{ }; // t, u – protected.
class D : public B{ }; // t – protected, u – public
class P : private B{ }; // t, u – private
Таким образом, можно только сузить область доступа, но не расширить.
Таким образом, внутри производного класса существует четыре уровня, для которых определяется атрибут доступа:
·для членов базового класса;
·для членов производного класса;
·для процесса наследования;
·для изменения атрибутов при наследовании.
Рассмотрим как при этом регулируется доступ к членам класса извне класса и внутри класса.
Доступ извне.
Доступными являются лишь элементы с атрибутом public.
·Собственные члены класса.
Доступ регулируется только атрибутом доступа, указанным при описании класса.
·Наследуемые члены класса.
Доступ определяется атрибутов доступа базового класса, ограничивается атрибутом доступа при наследовании и изменяется явным указанием атрибута доступа в производном классе.
Пример 2.1.2
Пример 2.1.2
class Basis{
public:
int a,b;
protected:
int c;};
class Derived:public Basis{
public:
Basis::a;};
void main(){
Basis ob;
Derived od;
ob.a; //правильно
ob.c; //ошибка
od.a; //правильно
od.b; //ошибка
Доступ изнутри.
·Собственные члены класса.
Доступ извне возможен только для public-членов класса.
private и protected-члены класса могут быть использованы только функциями- членами данного класса.
·Наследуемые члены класса.
private- члены класса могут использоваться только собственными функциями- членами базового класса, но не функциями членами производного класса.
protected или public-члены класса доступны для всех функций-членов. Подразделение на public, protected и private относится при этом к описаниям, приведенным в базовом классе, независимо от формы наследования.
Пример 2.1.3
Пример 2.1.3
class Basis{
int a;
public b;
void f1(int i){a=i;b=i;}
class Derived:private Basis{
public:
void f2(int i){
a=i; //ошибка
b=i;} // //правильно
};
В общем, мой друг ты одолел чтение этой статьи об наследование полиморфизм. Работы впереди у тебя будет много. Смело пиши комментарии, развивайся и счастье окажется в твоих руках. Надеюсь, что теперь ты понял что такое наследование полиморфизм, виртуальные функции, определение производного класса и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории С++ (C plus plus)
Из статьи мы узнали кратко, но содержательно про наследование полиморфизм
Комментарии
Оставить комментарий
С++ (C plus plus)
Термины: С++ (C plus plus)