Наследование (программирование)
Материал из Википедии — свободной энциклопедии
Насле́дование — один из 3 важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией и полиморфизмом), позволяющий создать новый объект на основе уже существующего объекта, при этом данные и функциональность существующего объекта «наследуются» новым объектом.
Содержание |
[править] Наследование в языке C++
«Наследование» в C++:
class A{ //базовый класс }; class B : public A{ //public наследование } class C : protected A{ //protected наследование } class Z : private A{ //private наследование }
Класс, от которого произошло наследование, называется «базовым». Классы, которые произошли от базового, называются «потомками» или «наследниками».
В C++ существует три типа наследования: public, protected, private. Спецификаторы доступа членов базового класса меняются в потомках следующим образом:
- при public-наследовании все спецификаторы остаются без изменения.
- при protected-наследовании все спецификаторы остаются без изменения, кроме спецификатора public, который меняется на спецификатор protected (то есть public-члены базового класса в потомках становятся protected).
- при private-наследовании все спецификаторы меняются на private.
Одним из основных преимуществ наследования является то, что указатель на классы—наследники может быть неявно преобразован в указатель на базовый класс, то есть для примера выше, можно написать
A* a = new B;
Эта интересная особенность открывает возможность динамической идентификации типа.
[править] Наследование в языке Delphi
Для использования механизма наследования в Delphi необходимо, в объявлении класса, справа от слова class
указать класс предок:
Предок:
TAncestor = class private protected public {Виртуальная процедура.} procedure VirtualProcedure; virtual; abstract; procedure StaticProcedure; end;
Наследник:
TDescendant = class(TAncestor) private protected public {Перекрытие виртуальной процедуры.} procedure VirtualProcedure; override; procedure StaticProcedure; end;
Абсолютно все классы в Delphi являются потомками класса TObject
. Если справа от слова class
предок не указан, то подразумевается, что этот класс потомок класса TObject
.
[править] Типы наследования
[править] Просто наследование
[править] Множественное наследование
При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости.
Множественное наследование реализовано в C++. Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Множественное наследование поддерживается в языке UML.
Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживает возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.