На этом шаге мы рассмотрим это понятие.
Нследование - второй принцип построения классов. Мы видели, что классы в общем случае могут составлять иерархию: один класс получается из другого, на основании другого получается третий и т. д. То есть речь идет о том, что и в классах существуют родители и дети, бабушки с дедушками, их внуки и т. д. Наследование предполагает, что все характеристики класса-родителя присваиваются классу-потомку. После этого потомку при необходимости добавляют новые характеристики. Иногда некоторые методы в классе-потомке, полученном от предков, переопределяются, т. е. наполняются новым содержанием.
Наследование используется не только при разработке классов, но и при проектировании приложения. Например, в VC++ есть класс Label (метка). Есл поместить экземпляр этой метки в форму (экземпляр Form), то свойство "шрифт" (Font) метки примет значение свойства "шрифт" из экземпляра Form. Mеняя параметры шрифта у родителя (Form), мы добиваемся изменения этих параметров у потомков (наследников). То есть метка автоматически будет наследовать это свойство от экземпляра Form, на который она помещена. Это же относится, например, и к классу Button (кнопка).
Пример, иллюстрирующий сказанное, показан на рисунке 1, из которого видно, как изменяется шрифт компонентов кнопка и метка в зависимости от изменения шрифта в форме.
Рис.1. Наследование свойства "шрифт" потомками от родителя
Мы не ставим своей целью разработку классов, но знать основные данные классов необходимо, т. к. иначе невозможно ими пользоваться при построении приложений в среде VC++.
Рассмотрим структуру базового класса, из которого могут создаваться классы-потомки. Объявление класса представлено ниже.
class <имя> { private: //Имя секции. Данные и методы, помещенные в эту секцию, //будут поступны только методам этого класса. Доступ к ним //методам производных классов запрещен <Приватные (частные) данные> <Приватные (частные) конструкторы> <Приватные (частные) методы> protected: //Имя секции. Данные и методы, помещенные в эту секцию, //будут доступны методам этого класса и производным от него, //т. е. его потомкам <Защищенные данные> <Защищенные конструкторы> <Защищенные методы> public: //Имя секции. Данные и методы, помещенные в эту секцию, //будут доступны методам всех классов <Общедоступные данные> <Общедоступные конструкторы> <Общедоступный деструктор> <Общедоступные методы> }; //обратите внимание, что так же заканчивается //и объявление структуры
Глядя на то, как объявляется класс, вспомним пример из 61 шага, где речь шла о том, что для структур в языке C++ можно задавать секции private, public, protected. Эти же секции можно задавать и для классов. Как и для структур, в этих секциях можно определять функции (в классах - это методы), а вызывать методы на выполнение можно только в соответствии с тем, в какой секции находится функция. Атрибуты private, public, protected называются атрибутами доступа к членам класса. В классах методы вызываются так же, как если бы они находились в структуре:
имя (экземпляра).f(фактические параметры функции);
А все эти сходства оттого, что в C++ структуры рассматриваются тоже как классы.
На следующем шаге мы рассмотрим полиморфизм.